이번엔 포렌식 문제이다. pcap 파일이하나 주어지고 분석하여 흔적을 찾고 그 흔적의 내용들을 가지고 푸는 문제이다.
문제에서 주어지는 pcap 파일의 통계정보는 아래와 같다. 대충보면 tcp, http 가 눈에보인다.
http 통계정보는 아래와 같다. multipart 가있는것을 보면 파일을 다운 혹은 업로드시켰고 결국엔 리버스쉘 코드르 업로드시킨것임을 유추할 수 있다,또한, GET 과 POST 정보는 오른쪽 하단과 같다.
또한, HTTP GET 메서드만 필터링시켜 URI 를 보면 무엇인가를 업로드시켰고, payload.php 를 실행히시킨 것 같다.
Follow HTTP Stream 를 하면 업로드시킨 payload.php 의 내용을 볼 수 있다. payload.php 의 내용은 리버스쉘 코드를 시스템함수 exec 로 실행시키고 192.168.170.145 호스트의 4242 포트로 전달이되는 것이다.
또한 Follow TCP Stream 을 하나보면 3번쨰 스트림에서 리버스쉘에서 주고받은 내용들이 보이게된다. 이 세번쨰 스트림을 분석하다보면 많은 내용들이 나오게된다. 우선 첫번쨰로 나오는 것은 passwd 같은 문자열이고 두번쨰로 나오는것은
/etc/shadow 정보이다. 이 계정정보들은 크랙할 수 있다. 또한 git clone 으로 깃레포지토리를 다운받아서 그 안에있는 실행파일인 backdoor -a 문자열을 실행한다.
똑같이 git clone 으로 다운받고 분석해본다. 우선 pcap 파일일에서 실행한 backboor 파일의 -a 옵션은 passwd hash 를 의미한다. backdoor 파일은 go 로 작성되었는데, 소스코드를 해석해보자면 verfiyPass 를하는데, 가운데 매개변수는 고정 salt 값이다. 즉, pcap 파일에서 나온 backdoor -a 뒤의 문자열은 passwd + salt(스크립트에 하드코딩되어있음) 하여 sha512 해시한것이고, 이는 hashcat 에 돌려볼 수 있다.
var hash string = "bdd04d9bb7621687f5df9001f5098eb22bf19eac4c2c30b6f23efed4d24807277d0f8bfccb9e77659103d78c56e66d2d7d8391dfc885d0e9b68acd01fc2170e3"
func passwordHandler(_ ssh.Context, password string) bool {
return verifyPass(hash, "1c362db832f3f864c8c2fe05f2002a05", password)
}
func verifyPass(hash, salt, password string) bool {
resultHash := hashPassword(password, salt)
return resultHash == hash
}
func hashPassword(password string, salt string) string {
hash := sha512.Sum512([]byte(password + salt))
return fmt.Sprintf("%x", hash)
}
hashcat 으로 리커버리해보면 november16 이란 패스워드가 나온다.
이제 james 계정으로 ssh 에 로그인할 수 있다. passwd 은 방금 얻은 november16 이다. 잊지않고 포트 를 2222로 설정해주어야한다. 이는 깃에 올라온 ssh 백도어파일은 2222 포트에서 돌아가기 떄문이다.
접속해서 suid 실행파일있나 find 로 찾아보면 suid 설정된 백도어파일이 나온다. -p 옵션으로 들어가면
root 를 탈취 가능하다.