
코드.js 난독화 해제부터 루트 권한 획득까지, CVE-2023-0386
| 포트 | 서비스 | 세부 정보 |
|---|---|---|
| 22/tcp | ssh | syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0) |
| 80/tcp | http | syn-ack ttl 63 nginx 2million.htb |
2million.htb를 /etc/hots 파일에 추가했습니다.
gobuster를 사용하여 2million.htb에 대해 경로 탐색을 수행했습니다.
열거 중에 /invite 엔드포인트를 발견했습니다.

/invite 페이지로 이동한 후

페이지를 검사하는 동안 inviteapi.min.js라는 JavaScript 파일에 난독화된 코드가 포함되어 있음을 발견했습니다:
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1 i(4){h 8={"4":4};$.9({a:"7",5:"6",g:8,b:\'/d/e/n\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}1 j(){$.9({a:"7",5:"6",b:\'/d/e/k/l/m\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}',24,24,'response|function|log|console|code|dataType|json|POST|formData|ajax|type|url|success|api/v1|invite|error|data|var|verifyInviteCode|makeInviteCode|how|to|generate|verify'.split('|'),0,{}))
de4js를 사용하여 코드의 난독화를 해제했으며, 그 결과 다음과 같은 읽기 쉬운 JavaScript가 생성되었습니다:

function verifyInviteCode(code) {
var formData = {
"code": code
};
$.ajax({
type: "POST",
dataType: "json",
data: formData,
url: '/api/v1/invite/verify',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}
function makeInviteCode() {
$.ajax({
type: "POST",
dataType: "json",
url: '/api/v1/invite/how/to/generate',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}
makeInviteCode() : 새 초대 코드를 생성합니다
verefyInviteCode(code) : 코드가 유효한지 확인합니다
이해를 돕기 위해 검증 요청을 가로챘습니다:

API는 JSON 응답을 사용합니다
브라우저 콘솔로 이동하여 makeInviteCode()를 실행했습니다.

데이터가 ROT13 암호로 암호화되어 있음을 확인했습니다.

복호화 후 /api/v1/invite/generate 엔드포인트를 발견했고, 그다음 초대 코드를 생성했습니다.

Base64 복호화

키
2F4BN-YI8OH-B0SCL-L8OE6 키가 입력되었고 성공적으로 승인되었습니다.

등록

홈 페이지

액세스 페이지
이 사이트의 많은 페이지가 제대로 작동하지 않지만, 액세스 페이지에서 흥미로운 일이 벌어집니다

API 엔드포인트 열거
connection pack 버튼을 클릭하여 VPN 파일을 업로드하고 GET 요청을 인터셉트했습니다.

그런 다음 사용 가능한 API 엔드포인트를 열거하기 위해 verbose 및 silent 옵션을 사용하여 curl 요청을 실행했습니다.


서버는 API 엔드포인트 목록을 JSON으로 응답했습니다.
admin은 GET, POST, PUT 메서드를 가진 3개의 API 엔드포인트를 가지고 있었습니다.
admin 엔드포인트 /api/v1/admin/vpn/generate로 admin 키를 생성하려고 시도했지만, admin이 아니었기 때문에 키가 생성되지 않았으며, 첫 번째 admin 엔드포인트 /api/v1/admin/auth가 이를 확인해 주었습니다.


Content-Type: application/json 및 필수 매개변수와 함께 올바른 PUT 요청 형식을 발견한 후, 내 사용자를 administrator로 성공적으로 승격했습니다.









username 필드에 ;whoami;를 주입했고, 관리자 전용 기능에서 흔히 사용되며 적절한 검증이 부족한 경우가 많은 PHP의 exec() 또는 system() 함수를 의심했습니다.
예를 들어, 취약한 코드는 아마 다음과 같았을 것입니다:
$username = $json->username;