1. hackerkid.blackhat.local의 소스 페이지 확인
→ SQL 삽입 시도 : DB의 테이블이나 필드의 이름을 모르고 보통 회원가입 창보단 로그인 창처럼 데이터베이스에 대한 무조건적인 검색을 시도하는 데에 많이 활용된다.
→ XSS 시도 : Stored XSS -> 해당 페이지엔 데이터를 저장하는 기능 없음
Reflected XSS , DOM-based XSS 시도 해봤지만 아무런 변화 없음
2. ② 예상했던 sql injection과 xss가 실행되지 않아 아무 테스트 값을 그냥 한번 넣어 보았다.
→ Email 필드에 넣은 값을 기준으로 출력됨 ⇒ email 필드에 값을 삽입해야 한다는 것을 알게 됨
3. 위 페이지 소스를 다시 확인해 보니 XMLFunction()이라는 함수가 신경 쓰여 xml에 관련된 취약점을 찾아 보았다.
XXE Injection에 대해 알게 되었다.
XXE Injection은 XML 타입의 데이터 요청을 전송할 때 XML의 외부 엔티티를 처리할 수 있게 설정이 되어있는 경우에 발생하는 취약점이다. XML 문서에 DTD(Document Type Definition)와 Entity를 이용하여 외부 엔터티를 실행해 서버의 민감한 정보에 접근한다.
cf ) XML을 내부에 정의한 경우 : <!ENTITY name "value">
XML을 외부에 정의한 경우 : <!ENTITY name SYSTEM "url or file">
Root 계정을 취득하는게 목표이므로 passwd 정보가 있는 /etc/passwd를 확인하는 xxe를 실행한다.
→ ①: DTD와 Entity 정의
② : 입력한 값 중에서 email이 응답 값으로 나타나므로 <email></email> 사이에entity 삽입
출력 결과 중 root:x:0:0:root:/root:/bin/bash은 아래와 같은 내용을 의미한다.
→ root: 사용자 이름 (계정 이름).
x: 패스워드가 /etc/shadow 파일에 저장되어 있음을 나타내는 필드.
실제 패스워드는 이 파일에 저장되어 있으며, x는 그 위치를 가리킴.
0: 사용자의 UID(User ID). 0은 일반적으로 슈퍼 유저(루트)의 UID를 나타냄.
0: 사용자의 GID(Group ID). 이 경우에도 0은 슈퍼 유저(루트)의 GID를 나타냄.
root: 사용자의 실제 이름 또는 주석 (comment) 필드.
/root: 사용자의 홈 디렉토리 경로.
/bin/bash: 사용자가 로그인할 때 실행되는 기본 쉘의 경로.
이 경우에는 루트 사용자가 Bash 쉘을 사용한다는 것을 의미
4. /bin/bash를 이용하는 다른 것이 없는지 검색해 보았다.
saket:x:1000:1000:Ubuntu,,,:/home/saket:/bin/bash은 다음과 같은 내용을 의미한다.
→ saket: 사용자 이름 (계정 이름).
x: 패스워드가 /etc/shadow 파일에 저장되어 있음을 나타내는 필드.
실제 패스워드는 이 파일에 저장되어 있으며, x는 그 위치를 가리킴.
1000: 사용자의 UID(User ID).
일반적으로 일반 사용자 계정은 1000 이상의 UID를 할당 받음.
1000: 사용자의 GID(Group ID).
일반적으로 일반 사용자 계정은 1000 이상의 GID를 할당 받음.
Ubuntu,,,: 사용자의 실제 이름 또는 주석 (comment) 필드.
/home/saket: 사용자의 홈 디렉토리 경로.
/bin/bash: 사용자가 로그인할 때 실행되는 기본 쉘의 경로.
이 경우에는 Bash 쉘을 사용한다는 것을 의미
여기서 bash 쉘이 시작될 때 .bashrc 스크립트를 실행시킨다.
. bashrc는 사용자의 홈 디렉토리에 위치하고 있으며, 사용자 별로 적용되는 설정 및 명령을 담고 있다.
5. 해당 파일을 XXE를 이용하여 출력해였다.
아무 내용이 출력이 되지 않았다.
왜냐하면 참조하는 파일이 올바른 XML 형식이 아니기 때문에 발생한다.
'</>/&'와 같은 XML 특수문자가 섞여 있으면 외부 entity참조가 끊어지게 되기 때문이다.
이를 해결하기 위해서는 php의 wrapper클래스를 사용하여 base64형태로 인코딩을 해야한다.
* 디코딩된 /home/saket/.bashrc의 내용 중 일부
#Setting Password for running python app
username="admin"
password="Saket!#$%@!!"
6. 위에서 나온 결과로 http://blackhat.local:9999로 이동하여 로그인을 시도한다.
→ name을 이용해야할거 같은 느낌을 주는 웹 페이지
7. 이미 정보수집단계에서 9999포트로 연결된 사이트는 Tornado로 되어있다는 사실을 알고 있다.
따라서 Tornado의 취약점을 검색해보았다. 그래서 SSTI(server-side template injection)라는 취약점을 알게 되었다.
SSTI는 사용자 입력 값이 기존 서버 측 Template엔진에 삽입되는 경우 발생한다.
공격자는 Template 구문을 이용해 악성 페이로드를 삽입하여 공격자가 원하는 액션을 수행하도록 하는 공격이다.
다양한 Template이 있고 Template마다 문법이 다르기 때문에 공격을 통해 템플릿을 구분할 수 도 있다. Tornado의 경우 주로 템플릿 엔진으로 Jinja2 사용한다고 한다.
SSTI를 테스트하려면, 서버 측에서 동적으로 페이지를 생성하거나 특정한 요청을 통해 템플릿 엔진에 입력된 값이 어떻게 처리되는지를 확인해야 한다. 이때 Jinja2는 url 파라미터로 {{7*7}}로 확인해 볼수 있다.
'rookies > 맥주는 클라우드 드리프트 (스터디)' 카테고리의 다른 글
모의 해킹 - 위협 모델링 단계 + 수정 (0) | 2024.01.06 |
---|---|
모의 해킹 - 정보 수집 단계 (0) | 2024.01.06 |