[Hack the hacker] How I p*n a XX Adu* Video system — a Reality CTF Challenges

Thu Nguyen
nightst0rm
Published in
9 min readJan 21, 2018

“Chiều chủ nhật buồn

Nằm trong căn gác đìu hiu

Ôi tiếng hát xanh xao của một buổi chiều

Trời mưa, trời mưa không dứt

Ô hay mình vẫn cô liêu

Lại ngày chủ nhật nữa, gấu thì chả có, ae bạn bè thì đi chơi vs gấu hết.

Feeling rảnh háng thì mình lại tìm thị phi … =))).

Thực ra là writeup này mình đã viết được gần 1 tháng bằng tiếng anh ròi, nhưng do vài vấn đề liên quan tới *tương lai nên mình đành viết lại và bóp méo đi vài chi tiết…

.

So we start!

.

Chúng ta tạm gọi target này là XX Adult Video (XX AV) gì đó như mấy blog “Tôi đã hack X như thế nào” mà thiên hạ giựt tít nhé.

Việc pwn được system của target này do tình cờ (hihi đã pwn được rồi thì cứ nói thế cho nó phải phép thôi =)) ) .

Đúng là tình cờ, đợt đó mình có chơi CTF của bên họ tổ chức.

Và theo bản năng của 1 thằng tò mò, thì trong 2 chal của họ mình đã escape out-of-the-box và get được shell với quyền normal user trên 2 con server đó.

Chuyện làm sao để escape được thì nó là 1 quá trình khác, do thời lượng có hạn nên mình xin phép ko đề cập ở đây.

Như một thói quen, thì mình check “ifconfig” và thấy được 2 chal trên đều nằm trong 1 mạng nội bộ có ip dạng “172.26.1.xx”, nó được connect vpn đến 1 mạng khác, có lẽ là để quản lý cho dễ chăng??

Check 1 vòng 2 con server thì đều ko có khả năng get được root,

Thôi thì lại vác xẻng ra đào bới server xem có thứ gì hay ho, biết đâu lại kiếm được 1 cái service nào đó bị lỗi chăng :v.

Yeah! Sau 1 thời gian đào bới, mình đã tìm ra 1 thứ rất lạ đều tồn tại trên cả 2 server:

Lúc đó thì mình ko biết nó là gì cả, chỉ biết nó được chạy với quyền root, và là custom service, mà đã là custom service thì chắc chắn phải có gì đó hay ho rồi!

Đảo thêm vòng nữa với việc tìm tên file như trên và mình đã thấy nó trong 1 server, được đặt tại path “/home/ubuntu/”.

Có lẽ sau khi deploy thì sysad đã quên xóa nó:

Đã có source rồi, bắt đầu cắm mắt vào đọc code, xem flow của code, tìm bug … (đây lại là 1 quá trình khác, mình ko đề cập chi tiết)

Và sau 2 tiếng ngồi lỳ trước màn hình, mình ko tìm thấy bug nào hay 1 flow nào của code có thể khai thác được cả!

WP Developer!

Đọc kỹ code thì thấy nó là 1 con dạng như agent được sử dụng trong việc quản lý các server con hay đại khái như thế! (Tại chức năng của nó hơi kỳ quặc nên mình ko dám khẳng định).

Lúc này mình ko focus vào phần source code của client nữa mà bắt đầu chuyển qua xem xét “how this agent interact with the mother server”!

Con agent này connect tới server và gửi dữ liệu thông qua SOAP, hoặc thứ gì đó giống như vậy!

Đại khái là khi đơn giản hóa nó trông như thế này:

Thêm vào đó: Việc truyền tải qua lại giữa agent và server được encrypt bằng 1 khóa nào đó định trước.

Nhưng mà ko quan tâm lắm, mình đang pwn con agent rồi mà!

Sau 1 vài tiếng suy nghĩ, mình quyết định focus vào con server kia, check các giao thức của nó.

Vì bất kể nó là gì, chỉ cần có input là có thể khai thác!

1 ngày và 1 đêm, cùng với 1 vài cốc cafe + bò húc…

Finally and Luckily, …

Mình đã tìm thấy 1 lỗi SQL Injection có thể khai thác ở con server kia!

.

.

Chưa kịp quẩy thì mình chợt nhận ra là việc query bị giới hạn dưới 50 char :(.

Có lẽ là query được truyền vào 1 stored procedure thành đối số, nên bị limit 50 char chăng???

Mình chỉ query được table name đại khái như này:

Còn khi query dài hơn sẽ bị lỗi do query bị cắt mất phần đuôi :(.

Ko tìm được cách bypass cái đó, mình đành nghĩ theo 1 hướng khác.

Lúc này mình nhớ ra, là MSSQL có thể exec được command, và nếu may mắn thì còn được exec với quyền system luôn =)).

Yeah! Với server này thì xp_cmdshell đã bị disabled!

( =))) Giả như mình check mà thấy nó được enable thì sẽ dừng lại ngay, vì đã có kẻ pwn system này trước mình. )

.

Tiếp theo mình đi tìm các query để enable xp_cmdshell,

Và rất may mắn và thần kỳ: tất cả các query để enable đều có chiều dài dưới 50 char!!!!

Để verify lại thì mình thử gửi ping request ra ngoài,

Lại may mắn nữa, =))) Mình đã nhận được ping request đến từ server này bằng 1 con server nằm ngoài mạng:

F*ck yeah!!!!!

Nếu tiếp tục, mình sẽ gặp trường hợp blind RCE.

Và ko đơn giản chút nào: Limit 20 char, no execution results!!!!!

Hmm, vậy khá giống 1 chall CTF trong thực tế!

Mình đã chơi CTF được 3 tháng, nó đủ cho mình nhận thấy challenge này hoàn toàn “solvable”!

.

.

Skipping stuck time

.

.

Trước đó, với vài hệ thống của khách, mình cũng gặp trường hợp gần giống như vậy:

Khi đó mình sử dụng “echo <hex content> > file” để tại ra file dưới dạng hex.

Và sau đó kết hợp với “certutil -decodehex file_in file_out” để decode file hex kia thành 1 file binary mới.

Certutil thì là built-in function của windows rồi, nên ta ko cần phải lo về chuyện nó có thực thi đc hay ko!

Vậy bây giờ ta có 1 scenario như thế này:

SQL Injection -> RCE -> append each hex byte of exe to a temp file -> write the commands “certutil -decodehex file_in file_out” to a bat file (write each two char using “echo|set /p='<2 char here>’>>file” -> use that bat file to decode hex to exe file -> run exe!

Tiếp theo là phải suy nghĩ tới việc run file exe!

Rất có thể server có con AV nào đó, nếu như ném malware lên thì chắc chắn bị tóm ngay. (Chủ yếu là mình muốn report đường đường chính chính nên ko vi phạm điều khoản thôi =)) )

Vậy mình quyết định sử dụng “nc.exe” do khi check lại thì đa số AV trên mạng đều không detect nó là malicous file và cũng nhẹ nữa!

Nghĩ lại 1 chút, file “nc.exe” nặng vài chục kB, mỗi lần mình chỉ send được vài byte, như vậy sẽ tốn rất nhiều tgian, và lại cũng ko chính xác nữa.

Có 1 giải pháp thay thế, là mình sử dụng powershell để download netcat về cho đỡ!

Sau vài giờ vướng bởi những thứ logic linh tinh,…

Cuối cùng mình đã kéo nc.exe về thành công và chạy nó!!!!!

Yeah!

Vậy là đúng như mình dự đoán, khi setup server thì sysad đã để MSSQL chạy với quyền system =))).

Chuyện tới đây có thể kết thúc được rồi…

But …

.

.

We need to go deeper!!

Đây là con server có vài trăm agent đang bị control bởi nó, và mình đang cầm quyền SYSTEM của con server này…

Hmm…

.

Quay lại code của con agent:

Ở đây file updatesensor được call vào lúc 12h bởi cronjob.

Còn đây là 1 phần quan trọng của file updatesensor sẽ được thực thi!

Như vậy, vào lúc 12h đêm, con agent này sẽ connect đến server để check xem có ver mới hay ko.

Nếu như có ver mới thì ngay lập tức nó sẽ down ver mới về, kill agent process và chạy agent mới.

Và hiện tại mình đang cầm quyền system của server này!

Như vậy, giả sử như mình chỉ cần sửa file version từ server, thay vài dòng code bên trong file agent và đến lúc 12h tất cả các agent sẽ được thay thế bằng agent mới mà mình đã inject code vào!

=> Mass ROOT REMOTE CODE EXECUTION!

Nghĩa là tất cả các server đang sử dụng agent này sẽ bị pwn!!!

Sau khi mình check lại thì có tất cả 230 con agent khác sẽ bị pwn nếu như kịch bản này xảy ra:

!!!

Và ngay lập tức mình đã tìm cách liên lạc với nhà sản xuất để họ fix bug này.

Do đợt đó vướng 1 “event lớn” bên họ nên việc fix bị delay mất vài ngày!

Và vài tuần sau đó:

Và cũng vài ngày sau đó :(

Tưởng có tiền tiêu tết rồi …

Hơi buồn 1 chút, nhưng cũng thấy nhẹ lòng vì đỡ 1 khoản cho bố mẹ ở quê.

.

.

Ngoài lề 1 chút…

Vừa rồi có join giải “ma-tét” để kiếm tí tiền ăn tết chơi mà khó quá :(.

Report BTC fix bug, loanh quanh thế nào bug cũ ko fix mà lại chòi ra thêm cái bug nữa :(

Và cuối cùng BTC quyết định drop chal luôn,…

Hazz, mà thôi chuyện qua rồi thì coi như xong đi.

.

.

Chủ nhật buồn lại càng buồn thêm, Hazzz.

“Bâng khuâng mình ta lạc trôi giữa đời
Ta lạc trôi giữa trời !!!!

--

--