Insecure Code Management 관련 문제입니다.
문제 제목이나 설명만보고 감이 안 와서 참고 문서? 관련 문서란을 보니 git 관련 문제인 것 같습니다.
Git 이란?
소스코드 관리를 위한 분산 버전 관리 시스템입니다. 즉, 여러 명의 개발자가 하나의 프로젝트를 개발할 경우, 소스코드를 효과적으로 관리(버전 관리, 백업 등)할 수 있게 하는 무료, 공개적 시스템입니다.
이 문제는 소스 코드 관리를 위해 git을 사용하고 있다 정도로만 이해하고 일단 문제에 접속해보았습니다.
HR Database에 접속하기 위한 로그인 폼이 존재합니다. 로그인 폼만 보면 가장 먼저하는 일은 [admin/admin] 같은 유추 가능한 계정으로 접근 시도해보는 것 아닐까요?ㅋㅋㅋ(저 같은 경우는 그렇습니다...ㅠ) 로그인해보았습니다.
Unknown user or password라는 에러 메시지만 출력되고 아무런 정보를 던져주지 않았습니다.
그렇다면, 이 문제를 어떻게 풀어야 할까 고민하다가 구글링 해본 결과! Git을 사용할 경우 git 디렉토리에 대한 접근 권한 여부를 설정하지 않아 내부 자원 유출 가능한 취약점이 존재한다는 사실을 발견하였습니다. (자세한 사항은 아래 링크)
>> https://medium.com/swlh/hacking-git-directories-e0e60fa79a36
개발자가 Git을 사용할 경우, 프로젝트 파일의 커밋 이력을 포함한 모든 버전의 제어 정보가 Git 디렉토리
[www.test.com/.git]에 보관되어 있습니다. 보통의 경우 일반 사용자가 해당 디렉토리에 접근 불가능해야하지만 접근 제어가 제대로 되어 있지 않은 경우, .git 디렉토리 엑세스 및 정보 유출이 가능합니다.
그래서, 이번 문제 접속 후, Git 디렉토리에 접근 시도해보았습니다.
위 스크린샷과 같이 별도의 인증 과정 없이 Git 디렉토리에 접근 가능하며, 정보를 획득할 수 있습니다.
(www.challenge01.root-me.org/web-serveur/ch61/.git)
Git 디렉토리 내 소스코드의 재구성을 위해 우선, wget 명령어를 사용해 디렉토리의 내용을 대량 다운로드합니다.
명령어 : wget -r http://www.challenge01.root-me.org/web-serveur/ch61/.git/
wget 명령어를 사용해 Git 디렉토리를 다운받으면, 위 사진과 같이 도메인 폴더가 자동으로 생성되어 있습니다.
웹 루트 폴더까지 타고 들어가 보았지만, index.html 파일만 있고 소스코드(index.php) 파일은 보이지 않네요.
Git 개체는 SHA1 해시의 처음 두 문자에 따라 /objects 디렉토리 하위에 저장됩니다.
예를 들어, 0a082f2656a655c8b0a87956c7bcdc93dfda23f8 해시를 가진 개체는 디렉토리 .git/objects/0a에082f2656a655c8b0a87956c7bcdc93dfda23f8의 이름으로 저장되고 있습니다.
.git/objects에는 다양한 유형의 개체, commit, a tree, a blob, an annotated tag 등이 저장되며 아래의 명령어를 사용해 객체의 유형을 결정할 수 있습니다.
> git cat-file -t OBJECT-HASH
- Commit 객체에는 commit의 디렉토리 트리 개체 해시, 부모 commit, 작성자, 날짜 및 메시지 정보를 저장
- Tree 객체에는 commit에 대한 디렉토리 목록
- Blob 객체에는 commit된 파일의 사본(실제 소스 코드)
- Tag 객체에는 태그가 지정된 객체와 관련 태그 이름에 대한 정보
> cat .git/HEAD
ref: refs/heads/master
> cat .git/refs/heads/master // commit의 디렉토리 트리를 저장하는 해시를 가리킴
c0b4661c888bd1ca0f12a3c080e4d2597382277b
> git cat-file -t c0b4661c888bd1ca0f12a3c080e4d2597382277b
commit
> git cat-file -p c0b4661c888bd1ca0f12a3c080e4d2597382277b
tree 94650eae3cb2615762a29ec073c53198adffd3c2 // tree object
> git cat-file -p 94650eae3cb2615762a29ec073c53198adffd3c2
blob 2e620c143ab6557a8dacb6a0c284d28c718d6a38 index.php
blob 663fe35facfd983a948d221c769438f230eb18ef config.php
94650eae3cb2615762a29ec073c53198adffd3c2에 저장된 tree object을 오픈할 경우!! 실제 소스 코드인 index.php와 config.php 파일 확인이 가능합니다.
다시 index.php에 해당하는 blob 객체를 오픈하면 index.php 소스코드가 출력되고 있습니다. (정보 유출 성공!)
> git cat-file -p 2e620c143ab6557a8dacb6a0c284d28c718d6a38
index.php 소스코드 내에서는 패스워드를 입력받아 sha256으로 해시한 값과 config.php 파일 내 password 값을 비교하고 있습니다.
config.php에 해당하는 blob 객체를 열면 config.php 소스코드가 출력됩니다.
$password 값 0c25a741349bfdcc1e579c8cd4a931fca66bdb49b9f042c4d92ae1bfa3176d8c를 획득하였습니다.
해당 값이 sha256 해쉬로 암호화되어 있음이 확인 가능하니, 아래의 온라인 sha256 복호화 사이트를 이용하였습니다.
>> https://md5hashing.net/hash/sha256
(일부 sha256 복호화 사이트에서는 해당 값이 복호화되지 않는 경우 발생)
획득한 해쉬값을 입력하면 평문의 Admin 패스워드가 출력되고 있고, 이 값이 Flag 값입니다.^^
※ 참고 자료
- https://medium.com/swlh/hacking-git-directories-e0e60fa79a36
'Study > Wargame' 카테고리의 다른 글
[root-me] SQL injection - Time based (1) | 2020.09.25 |
---|---|
[root-me] XSLT - Code execution (0) | 2020.07.02 |
[root-me] SQL Injection - File reading (0) | 2020.04.01 |
[root-me] SQL Injection - Routed (0) | 2020.03.20 |
[root-me] SQL injection - Error (0) | 2020.03.12 |