之前聼別人說反彈shell是web的内容,總感覺會在pwn中用的都是全棧大佬。在復現HITCTF2020的時候,發現簽到題dagongren用的就是反彈shell。趁機學1下,很基礎的shell啊原來是…
原理
與Bind Shell的區別
Bind Shell:將bash shell綁定到指定端口(如4444),從攻擊端連接到被控端的該端口。從而攻擊端發送給受控端的cmd都會被執行。
Reverse Shell:攻擊端在監聽目標主機的同時,目標主機啓用了shell並回傳給攻擊端。
測試
這裏用的是debian-mips。首先配置網卡,使兩邊互相ping通。

攻擊端先監聽一個端口:

在目標主機上啓用一個shell,可以看到攻擊端已經獲得目標主機的shell了:

或者-e直接exec:

這裏主要用的是netcat工具。具體 -l , -v , -p ,-e 這些參數什麽意思可以用 nc -h 查:

/dev/tcp/IP/PORT 文件是linux的特殊設備文件,是bash用來實現網絡請求(基於socket通信)的一個接口,實際上並不存在。
這些是標準輸入、標準輸出、錯誤輸出的重定向命令:
0>&1 ; 1>&2 ; ...
例題:dagongren
程序存在很明顯的棧溢出漏洞,偏移是0x20:

程序的bss段很短,但gdb調試的時候會發現它後面還有很大一段可讀可寫可執行的空間。

因此可以將shellcode寫到這個地方:
這裏程序輸入完后關閉了STDOUT和STDERR。也許是pwntools對錯誤的檢驗有點問題(這裏我并不是很懂emm),會EOF:

本地測試的話可以用socat fork一個服務器,用remote連(`127.0.0.1`或`localhost`都可以,是本地就行),相當於搭了個遠端環境。
socat TCP-LISTEN:1234,reuseaddr,fork EXEC:./dagongren1
再次運行,交互成功。但輸入的命令,被執行後沒有顯示:

原因是程序結尾關閉了stdout和stderr。因此需要用到重定向:
sl('exec /bin/sh >&0')
將新起的shell重定向到輸出通道0后,就能在當前的這個shell下用了。由於這個shell是新起的,stdout是打開狀態,後續的cat也就能正常回顯了:

實際上不新起一個shell也可以。既然能重定向到輸出通道0,爲什麽不直接把cat結果重定向到輸出通道0呢:

上面這種就是bind shell方式。既然需要重起一個shell來繞過fclose(stdout),爲什麽不直接在目標機中起呢。也就是反彈shell的方法。
這次寫的是反彈shell的shellcode,而不是正向的getshell:
參考鏈接