最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Scapy隨心所欲研究TCP協(xié)議棧

 更新時(shí)間:2018年11月20日 11:06:47   作者:五山小新新  
今天小編就為大家分享一篇關(guān)于Python Scapy隨心所欲研究TCP協(xié)議棧,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

1. 前言

如果只需要研究Linux的tcp協(xié)議棧行為,只需要使用packetdrill就能夠滿足我的所有需求。packetdrill才是讓我隨心所欲地撩tcp協(xié)議棧。packetdrill的簡(jiǎn)單使用手冊(cè)。

然而悲劇的是,除了要研究Linux的TCP協(xié)議棧行為,還需要研究Windows的tcp協(xié)議棧的行為,Windows不開源,感覺里面應(yīng)該有挺多未知的坑。

為了能夠重現(xiàn)Windows的tcp協(xié)議棧的一些網(wǎng)絡(luò)行為,這里使用python的scapy進(jìn)行包構(gòu)造撩撩Windows的tcp協(xié)議棧。scapy在tcp數(shù)據(jù)報(bào)文注入會(huì)有一點(diǎn)的時(shí)延,這個(gè)工具在要求時(shí)延嚴(yán)格的場(chǎng)景無法使用(還是packetdrill好用,囧)。針對(duì)目前遇到的場(chǎng)景,勉強(qiáng)能用,再則已經(jīng)擼慣了python,上手起來比較容易。

2. 基本語(yǔ)法

  • 安裝scapy

在Centos 7.2中直接使用yum install 來安裝。

yum install scapy.noarch 
  • help 能解決大部分問題
[root@localhost ~]# scapy
INFO: Can't import python gnuplot wrapper . Won't be able to plot.
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)
>>> help(send)

在大部分時(shí)候,如果看到不明白的地方,請(qǐng)用help。其次是官方的參考手冊(cè)

  • 基本語(yǔ)法

ip/tcp/http數(shù)據(jù)包操縱

>>> IP()
<IP |>
>>>> IP()/TCP()
<IP frag=0 proto=tcp |<TCP |>>
>>>> IP(proto=55)/TCP()
<IP frag=0 proto=55 |<TCP >> 
>>>> Ether()/IP()/TCP()
<Ether type=IPv4 |<IP frag=0 proto=tcp |<TCP |>>>
>>>> IP()/TCP()/"GET /HTTP/1.0\r\n\r\n"   數(shù)據(jù)部分可以直接使用字符串
<IP frag=0 proto=tcp |<TCP |<Raw load='GET /HTTP/1.0\r\n\r\n' |>>> 
>>>> Ether()/IP()/UDP()
<Ether type=IPv4 |<IP frag=0 proto=udp |<UDP |>>>
>>>> Ether()/IP()/IP()/UDP()
<Ether type=IPv4 |<IP frag=0 proto=ipencap |<IP frag=0 proto=udp |<UDP |>>>>
>>> str(IP())
'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
>>> IP(_)
<IP version=4L ihl=5L tos=0x0 len=20 id=1 flags= frag=0L ttl=64 proto=hopopt 
chksum=0x7ce7 src=127.0.0.1 dst=127.0.0.1 |>
>>> a=Ether()/IP(dst="www.baidu.com")/TCP()/"GET /index.html HTTP/1.0 \n\n"
>>> hexdump(a)
0000  00 03 0F 19 6A 49 08 00 27 FE D8 12 08 00 45 00  ....jI..'.....E.
0010  00 43 00 01 00 00 40 06 70 78 C0 A8 73 C6 B4 61  .C....@.px..s..a
0020  21 6C 00 14 00 50 00 00 00 00 00 00 00 00 50 02  !l...P........P.
0030  20 00 B3 75 00 00 47 45 54 20 2F 69 6E 64 65 78  ..u..GET /index
0040  2E 68 74 6D 6C 20 48 54 54 50 2F 31 2E 30 20 0A  .html HTTP/1.0 .
0050  0A                         .
>>> b=str(a)
>>> b
"\x00\x03\x0f\x19jI\x08\x00'\xfe\xd8\x12\x08\x00E\x00\x00C\x00\x01\x00\x00@\x06px
\xc0\xa8s\xc6\xb4a!l\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb3u
\x00\x00GET /index.html HTTP/1.0 \n\n"

1.數(shù)據(jù)包發(fā)送

數(shù)據(jù)包的發(fā)送主要包括以下函數(shù)send/sendp/sr/sr1/srp 主要區(qū)別是:

send函數(shù)工作在第三層

send(IP(dst="192.168.115.188")/ICMP())

sendp函數(shù)工作在第二層,你可以選擇網(wǎng)卡和協(xié)議

sendp(Ether()/IP(dst="192.168.115.188",ttl=(1,4)),iface="eth0")

fuzz函數(shù)的作用:可以更改一些默認(rèn)的不可以被計(jì)算的值(比如校驗(yàn)和checksums),更改的值是隨機(jī)的,但是類型是符合字段的值的。

send(IP(dst="www.baidu.com")/UDP()/NTP(version=4),loop=2) #未使用fuzz()
send(IP(dst=" www.baidu.com")/fuzz(UDP()/NTP(version=4)),loop=2) #使用fuzz() 

SR()函數(shù)用來來發(fā)送數(shù)據(jù)包和接收響應(yīng)。該函數(shù)返回有回應(yīng)的數(shù)據(jù)包和沒有回應(yīng)的數(shù)據(jù)包;該函數(shù)也算得上是scapy的核心了,他會(huì)返回兩個(gè)列表數(shù)據(jù),一個(gè)是answer list 另一個(gè)是unanswered

>>> sr(IP(dst="192.168.115.1")/TCP(dport=[21,22,23]))
Begin emission:
Finished to send 3 packets.
***
Received 3 packets, got 3 answers, remaining 0 packets
Results: TCP:3 UDP:0 ICMP:0 Other:0>, Unanswered: TCP:0 UDP:0 ICMP:0 Other:0
>>> ans,unans=_  這也是scapy的核心了
>>> ans.show()
0000 IP / TCP 192.168.115.198:ftp_data > 192.168.115.1:ftp S ==> IP / TCP 192.168.115.1:ftp > 192.168.115.198:ftp_data RA / Padding
0001 IP / TCP 192.168.115.198:ftp_data > 192.168.115.1:ssh S ==> IP / TCP 192.168.115.1:ssh > 192.168.115.198:ftp_data RA / Padding
0002 IP / TCP 192.168.115.198:ftp_data > 192.168.115.1:telnet S ==> IP / TCP 192.168.115.1:telnet > 192.168.115.198:ftp_data SA / Padding 
>>>sr(IP(dst="192.168.115.1")/TCP(dport=[21,22,23]),inter=0.5,retry=-2,timeout=1) 網(wǎng)絡(luò)環(huán)境不好時(shí),也可以追加inter retry timeout等附加信息,

函數(shù)sr1()是sr()一個(gè)變種,只返回應(yīng)答發(fā)送的分組(或分組集)。這兩個(gè)函數(shù)發(fā)送的數(shù)據(jù)包必須是第3層數(shù)據(jù)包(IP,ARP等)。而函數(shù)SRP()位于第2層(以太網(wǎng),802.3,等)。

>>> p=sr1(IP(dst="192.168.115.188")/ICMP()/"test")
Begin emission:
.....Finished to send 1 packets.
.*
Received 7 packets, got 1 answers, remaining 0 packets
>>> p
<IP version=4L ihl=5L tos=0x0 len=32 id=26000 flags= frag=0L ttl=128 proto=icmp chksum=0x6c79 src=192.168.115.188 dst=192.168.115.198 options=[] |<ICMP type=echo-reply code=0 chksum=0x1826 id=0x0 seq=0x0 |<Raw load='test' |<Padding load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
>>> p.show()
###[ IP ]###
 version= 4L
 ihl= 5L
 tos= 0x0
 len= 32
 id= 26000
 flags= 
 frag= 0L
 ttl= 128
 proto= icmp
 chksum= 0x6c79
 src= 192.168.115.188
 dst= 192.168.115.198
 \options\
###[ ICMP ]###
   type= echo-reply
   code= 0
   chksum= 0x1826
   id= 0x0
   seq= 0x0
###[ Raw ]###
    load= 'test'
###[ Padding ]###
      load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

1.數(shù)據(jù)包sniff

a=sniff(count=1,filter="tcp and host 192.168.1.1 and port 80")

使用sniff主要是用于數(shù)據(jù)包的接收,根據(jù)filter設(shè)定的條件,將符合條件的數(shù)據(jù)包接收回來。

3. 場(chǎng)景構(gòu)造

scapy的缺點(diǎn)是,他只負(fù)責(zé)構(gòu)造包,是單向的。不像packetdrill這么完美,packetdrill 不但可以構(gòu)造包,還能實(shí)現(xiàn)系統(tǒng)調(diào)用構(gòu)造不同的場(chǎng)景,還能幫你檢查協(xié)議棧發(fā)出的數(shù)據(jù)包是否符合預(yù)期。撩協(xié)tcp協(xié)議棧的過程不外乎兩端,一端使用系統(tǒng)調(diào)用模擬協(xié)議棧行為,另外一端則是我們構(gòu)造的包。常見場(chǎng)景主要是:服務(wù)器場(chǎng)景、客戶端場(chǎng)景。

  • 服務(wù)器場(chǎng)景:

服務(wù)器場(chǎng)景使用系統(tǒng)調(diào)用(即用戶態(tài)程序),而客戶端則是scapy構(gòu)造的包。

在這里構(gòu)造一個(gè)簡(jiǎn)單的三次握手后向服務(wù)器端發(fā)送數(shù)據(jù)。為了防止Linux客戶端rst。

iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.56.1 -j DROP
#!/usr/local/bin/python
from scapy.all import *
# VARIABLES
src = sys.argv[1]
dst = sys.argv[2]
sport = random.randint(1024,65535)
dport = int(sys.argv[3])
# SYN
ip=IP(src=src,dst=dst)
SYN=TCP(sport=sport,dport=dport,flags='S',seq=1000)
SYNACK=sr1(ip/SYN)
# ACK
ACK=TCP(sport=sport, dport=dport, flags='A', seq=SYNACK.ack, ack=SYNACK.seq + 1)
send(ip/ACK)

在這里可以安裝一個(gè)nginx來驗(yàn)證。

  • 客戶端場(chǎng)景:

客戶端場(chǎng)景使用系統(tǒng)調(diào)用(即用戶態(tài)程序),而服務(wù)器端則是scapy構(gòu)造包。

在這里使用scapy構(gòu)造一個(gè)簡(jiǎn)單的http服務(wù)器。為了防止協(xié)議棧發(fā)送RST,需要對(duì)iptables進(jìn)行設(shè)置。

iptables -A OUTPUT -p tcp --tcp-flags RST RST --sport 80 -j DROP
#!/usr/bin/python
from scapy.all import *
# Interacts with a client by going through the three-way handshake.
# Shuts down the connection immediately after the connection has been established.
# Akaljed Dec 2010, http://www.akaljed.wordpress.com
# Wait for client to connect.
a=sniff(count=1,filter="tcp and host 192.168.1.1 and port 80")
# some variables for later use.
ValueOfPort=a[0].sport
SeqNr=a[0].seq
AckNr=a[0].seq+1
# Generating the IP layer:
ip=IP(src="192.168.1.1", dst="192.168.1.2")
# Generating TCP layer:
TCP_SYNACK=TCP(sport=80, dport=ValueOfPort, flags="SA", seq=SeqNr, ack=AckNr, options=[('MSS', 1460)])
#send SYNACK to remote host AND receive ACK.
ANSWER=sr1(ip/TCP_SYNACK)
# Capture next TCP packets with dport 80. (contains http GET request)
GEThttp = sniff(filter="tcp and port 80",count=1,prn=lambda x:x.sprintf("{IP:%IP.src%: %TCP.dport%}"))
AckNr=AckNr+len(GEThttp[0].load)
SeqNr=a[0].seq+1
# Print the GET request
# (Sanity check: size of data should be greater than 1.)
if len(GEThttp[0].load)>1: print GEThttp[0].load
# Generate custom http file content.
html1="HTTP/1.1 200 OK\x0d\x0aDate: Wed, 29 Sep 2010 20:19:05 GMT\x0d\x0aServer: Testserver\x0d\x0aConnection: Keep-Alive\x0d\x0aContent-Type: text/html; charset=UTF-8\x0d\x0aContent-Length: 291\x0d\x0a\x0d\x0a<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\"><html><head><title>Testserver</title></head><body bgcolor=\"black\" text=\"white\" link=\"blue\" vlink=\"purple\" alink=\"red\"><p><font face=\"Courier\" color=\"blue\">-Welcome to test server-------------------------------</font></p></body></html>"
# Generate TCP data
data1=TCP(sport=80, dport=ValueOfPort, flags="PA", seq=SeqNr, ack=AckNr, options=[('MSS', 1460)])
# Construct whole network packet, send it and fetch the returning ack.
ackdata1=sr1(ip/data1/html1)
# Store new sequence number.
SeqNr=ackdata1.ack
# Generate RST-ACK packet
Bye=TCP(sport=80, dport=ValueOfPort, flags="FA", seq=SeqNr, ack=AckNr, options=[('MSS', 1460)])
send(ip/Bye)
# The End

這個(gè)服務(wù)器只需要使用wget或者curl就可以實(shí)現(xiàn)驗(yàn)證了。

4. 參考資料

http://www.secdev.org/projects/scapy/doc/usage.html#starting-scapy

https://akaljed.wordpress.com/2010/12/12/scapy-as-webserver/

http://lost-and-found-narihiro.blogspot.com/2012/12/scapy-simple-web-server-with-scapy.html

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • python實(shí)現(xiàn)的解析crontab配置文件代碼

    python實(shí)現(xiàn)的解析crontab配置文件代碼

    這篇文章主要介紹了python實(shí)現(xiàn)的解析crontab配置文件代碼,也可以說是python版的crontab,代碼中包含大量注釋,需要的朋友可以參考下
    2014-06-06
  • Python列表計(jì)數(shù)及插入實(shí)例

    Python列表計(jì)數(shù)及插入實(shí)例

    這篇文章主要介紹了Python列表計(jì)數(shù)及插入的用法,以實(shí)例形式對(duì)列表的計(jì)數(shù)與插入用法做了較為詳細(xì)的分析,需要的朋友可以參考下
    2014-12-12
  • 深度學(xué)習(xí)之GPU,CUDA和cuDNN的理解

    深度學(xué)習(xí)之GPU,CUDA和cuDNN的理解

    Cuda和cudnn是支持NVIDIA支持GPU的兩個(gè)庫(kù),分別用于高性能計(jì)算和深度神經(jīng)網(wǎng)絡(luò)計(jì)算的支持,下面這篇文章主要給大家介紹了關(guān)于深度學(xué)習(xí)之GPU,CUDA和cuDNN的理解,需要的朋友可以參考下
    2023-02-02
  • Python 中的Sympy詳細(xì)使用

    Python 中的Sympy詳細(xì)使用

    這篇文章主要介紹了Python 中的Sympy詳細(xì)使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • python基于Node2Vec實(shí)現(xiàn)節(jié)點(diǎn)分類及其可視化示例詳解

    python基于Node2Vec實(shí)現(xiàn)節(jié)點(diǎn)分類及其可視化示例詳解

    這篇文章主要為大家介紹了python基于Node2Vec實(shí)現(xiàn)節(jié)點(diǎn)分類及其可視化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • pycharm + django跨域無提示的解決方法

    pycharm + django跨域無提示的解決方法

    這篇文章主要給大家介紹了關(guān)于pycharm + django跨域無提示的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python圖像處理之圖像量化處理詳解

    Python圖像處理之圖像量化處理詳解

    這篇文章將介紹圖像量化處理,即將圖像像素點(diǎn)對(duì)應(yīng)亮度的連續(xù)變化區(qū)間轉(zhuǎn)換為單個(gè)特定值的過程。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-02-02
  • 關(guān)于Python-pip安裝失敗問題及解決

    關(guān)于Python-pip安裝失敗問題及解決

    這篇文章主要介紹了關(guān)于Python-pip安裝失敗問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟

    零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟

    這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • python實(shí)現(xiàn)rsa加密實(shí)例詳解

    python實(shí)現(xiàn)rsa加密實(shí)例詳解

    這篇文章主要介紹了python實(shí)現(xiàn)rsa加密實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評(píng)論

莒南县| 南溪县| 中宁县| 靖西县| 大宁县| 凉城县| 民权县| 西和县| 孟州市| 高碑店市| 页游| 榆林市| 姚安县| 宁波市| 长汀县| 安达市| 镇宁| 渭源县| 新乐市| 新津县| 江孜县| 贺州市| 边坝县| 高州市| 太谷县| 武穴市| 新绛县| 宝清县| 长葛市| 新兴县| 南川市| 瑞丽市| 长白| 台安县| 阿城市| 鸡东县| 武强县| 南郑县| 茂名市| 佛学| 武冈市|