
From deobfuscating code.js to root, 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;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
이 엔드포인트 POST /api/v1/admin/vpn/generate는 취약했으며, OS 명령 주입이 성공적으로 수행되었습니다.



애플리케이션에 특수 문자를 차단하는 제한이 있었기 때문에, 이 제한을 우회하기 위해 리버스 셸 페이로드 명령을 base64로 인코딩했습니다.

username 매개변수에 페이로드를 주입하고, 디코딩 및 실행을 위해 base64 -d | bash로 파이프했습니다:


페이로드가 성공적으로 실행되어 www-data user 권한으로 리버스 셸을 반환했습니다.

다양한 기법을 사용하여 www-data user에서 admin user로의 횡적 이동을 시도했습니다.
/var/www/html 디렉터리를 조사하던 중 데이터베이스 자격 증명이 포함된 .env 파일을 발견했습니다:

발견된 비밀번호는 SSH 및 MySQL 인증을 위해 성공적으로 재사용되었습니다.
SSH

MySQL

admin 사용자로 초기 액세스 권한을 얻은 후, 잠재적인 권한 상승 벡터를 식별하기 위해 시스템 열거를 수행했습니다.
SUID 바이너리, capabilities, sudo 권한, cron 작업과 같은 가장 흔한 권한 상승 기법을 모두 시도했지만 아무것도 작동하지 않았습니다. 그래서 PATH 하이재킹이나 민감한 변수가 있는지 환경 변수를 확인했고, /var/mail/admin을 가리키는 MAIL variable을 발견했습니다.

메일 내용을 확인했고, admin에게 OverlayFS/FUSE 취약점에 대비해 커널을 패치하라는 경고가 있었음을 확인했습니다.

커널 버전

OS 버전

커널은 전혀 업데이트되지 않았으며, 이는 관리자가 보안 경고를 무시했거나 잊어버렸음을 확인시켜 줍니다.
커널 열거 결과 버전 5.15.70-051570-generic이 확인되었으며, 이는 CVE-2023-0386 OverlayFS/FUSE 로컬 권한 상승에 취약합니다.
취약점이 확인됨에 따라 공개된 POC 익스플로잇을 확보했습니다.
POC를 클론한 후 대상 머신으로 전송했습니다.
그런 다음 이를 실행하여 root 액세스 권한을 성공적으로 획득했습니다.


CVE-2023-0386 - CVE-2023-0386 - OS 명령 주입
고지 사항: 이 머신은 승인된 침투 테스트 환경에서 루팅되었습니다.
| 단계 | 기법 | 대상 | 결과 |
|---|
| 1. 정찰 | 포트 스캔 | 22 (SSH), 80 (HTTP) | 서비스 발견 |
| 경로 탐색 | /invite | 초대 페이지 발견 | |
| JS 난독화 해제 | inviteapi.min.js | API 엔드포인트 노출 | |
| 2. 초기 액세스 | 초대 코드 생성 | POST /api/v1/invite/generate | 유효한 초대 코드 |
| 등록 | POST /api/v1/user/register | 표준 사용자 생성 | |
| 3. 웹 권한 상승 | API 열거 | GET /api/v1 | Admin 엔드포인트 발견 |
| 수직 권한 상승 | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. 시스템 액세스 | 명령 주입 | POST /api/v1/admin/vpn/generate | username=test;id; |
| 리버스 셸 | Base64 인코딩 페이로드 | www-data 셸 | |
| 5. 횡적 이동 | 파일 발견 | /var/www/html/.env | admin:SuperDuperPass123 |
| SSH 재사용 | ssh [email protected] | admin 사용자 액세스 | |
| 6. Root 권한 상승 | 커널 열거 | uname -r -> 5.15.70 | CVE-2023-0386 식별됨 |
| 이메일 경고 | /var/mail/admin | OverlayFS/FUSE 확인됨 | |
| 익스플로잇 실행 | ./fuse && ./exp | Root 셸 |