FINAL SVATTT 2021
Last updated
Was this helpful?
Last updated
Was this helpful?
TL,DR;
Đây là lần đầu cũng như lần cuối vào final của mình, tuy khá thất vọng vì không giải được bài nào nhưng team mình cũng đã tự lực cánh sinh 1 crypto cho tất cả kéo team vào top 4. hy vọng năm sau web UIT không còn phế nữa. dưới đây là wu 2 bài mình giải được sau cuộc thi :(
source code:
bài này được cung cấp full source + docker để test local.
ở mỗi bài được cung cấp docker thì mình thường nhìn vào file docker trước để hình dung service.
theo như docker-compose.yml của bài thì bài này sẽ bao gồm 2 service là php và gitlab, php đc expose ra internet và gitlab là service internal. Đọc Docker file của gitlab thì thấy đây là ver 13.10.2 dính lỗi unauthen rce gần đây, đồng thời flag nằm trong service này, vậy mục tiêu của mình là phải rce gitlab, nhưng làm thế nào để rce khi gitlab là service internal? continue reading pls.
ở php service có hệ thống file như sau
mình sẽ tập trung lần lượt vào một số file quan trọng sau
nhìn vào file, đập vào mắt mình là include, mình mừng thầm trong lòng vì có thể 1 hit rce mà không cần authen nếu như ko có blacklist kia. đúng là cuộc sống đâu có dễ dàng, phần tiếp theo của index.php thì nó check xem user đc set trong cookie có đúng vs trong database hay ko, và cả 2 tham số đều được escape bằng mysqli_real_escape_string
.
ở login cũng bị escape ở username, và password sau khi được thông qua một số điều kiện sẽ được hash md5. nên cũng không có khả năng attack here.
ở file này, nếu user đã được authen thì sẽ được sử dụng chức năng upload, upload một file extension bất kỳ không nằm trong filter là php phar và pht
,việc bypass blacklist ở đây khá đơn giản, có thể sử dụng các extension ít sử dụng khác là phtml và inc
. thứ tiếp theo cần bypass là get image size, để bypass được đoạn này thì ta có 2 cách, add php code vào 1 file ảnh thật, và rename lại với đuôi .phtml
hoặc có thể chỉ cần add magic number của gif ở đầu file là pass. nhưng vấn đề ở đây vẫn là authen.
sau khi nhận thấy hàm auth
được call khá nhiều chỉ nhằm để confirm authen nên mình sẽ ngó vào nó.
hàm này khá đơn giản, lấy 32 ký tự cuối làm hash password, còn lại phần đầu là username, nhưng hash pass lại không được sử dụng ở bất kỳ đâu trong hàm? deju? năm ngoái cũng có một bài php ở vòng loại svattt lừa mình kiểu này nên năm nay mình ko bị lừa nữa. câu query chỉ check username có tồn tại hay không. vậy điểm đến tiếp theo của mình sẽ là sql file.
có một username được init là chongxun
vậy chỉ cần send request cookie user= chongxun+32 rác char
thì sẽ được tính là authen.
sau khi có authen thì việc của mình là up shell, sau khi up shell thì mình check phpinfo()
thì thấy tất cả các hàm có khả năng rce đề bị ban. vây tiếp theo mình phải bypass disable function . gần đây có một poc bypass disable function all ver của php
vậy có thể thoải mái rce, sau khi run được ls thì mình gặp một vấn đề tiếp theo đó là không thể rev shell vì server ko có oob, trong khi cố gắng tìm cách đi tiếp thì minhf bị phá liên tục. server cứ 5p reset 1 lần, vậy sau 5p shell bị mất, có ai đó đã xóa tất cả .phtml
ngay sau khi file được upload, có thể crontab while true rm *.phtml. sau khoảng 1 tiếng ko bị xóa file nữa, mình lại bị thêm một vấn đề đó là bị 403 file .phtml và .inc
lúc này mình khá cay cú. và có bạn nào đó cũng cay giống mình khi để lại lời nhắn trên server.
sau sự cố trên thì mình quyết định quay về với mảnh đất local để test one hit read flag.
trong lúc đọc docker file thì mình nhận thấy curl được cài, lúc đó mình nghĩ ý của a @ducnt là sử dụng curl để trigger rce gitlab.
trong khoảng 5 tiếng tiếp theo mình lần mò để sử dụng curl để send request rce nhưng đều không thành công, khi còn 30p nữa hết giờ thì cuối cùng mình cũng làm cho gitlab exiftool nôn ra error nhưng ko trigger được cmd chứng tỏ payload exiftool mình bị sai. mãi khi end thì mình mới được biết là cần phải sử dụng tunnel để access vào gitlab sao đó xài poc đã được public trên mạng để trigger rce.
để tunnel thì mình xài sock5, upload thêm một php shell tunnel lên service php,
sử dụng tool này để gen php shell tunnel, sau đó connect vào shell vừa up và tạo sock server local bằng lệnh sau.
python3 neoreg.py -k password -u http://10.0.5.133:1337/images/upload/tunnel.php
set up trình duyệt chuyển qua proxy sock5, sau đó access thẳng vào ip của gitlab
tới bước này thì mình custom lại poc gitlab rce 1 tí để python script có thể access vào gitlab bằng việc thêm option proxies={"http":"socks5://127.0.0.1:1080"}
vào mỗi request .
nhưng vì cả 2 service php và gitlab đều ko có oob nên mình phải kiếm chỗ nào đó có thể writefile và có thể access trực tiếp ở url.
mình thử up một hình bình thường lên và nó sẽ trả về đường dẫn cho mình ở {'link': {'alt': 'a', 'url': '/uploads/-/system/temp/b51b22bf86e729405091ac9b1e8c92ad/a.jpg', 'markdown': ''}}
mình vào check docker thì thấy thư mục này có quyền ghi, nên mình sẽ ghi output cmd vào đây để đọc .
cuối cùng gom lại thành read flag 1 hit như sau.
ps: vì server down nên mình chỉ có thể làm ở local.