Hackctf[Web] Authenticate
들어가면 로그인 창이 하나 있다.
일단 보이는게 거의 없어서 관리자 도구로 까보았다.
너무나도 수상하기때문에 이녀석이 먼가 있을것 같다고 생각하여 일단 보기 편하게 vscode로 옮겼다.
$(".c_submit").click(function(event) {
event.preventDefault();
var u = $("#cpass").val();
var k = $("#cuser").val();
var func = "\x0d\x13\x45\x17\x48\x09\x5e\x4b\x17\x3c\x1a\x1f\x2b\x1b\x7a\x0c\x1f\x66\x0b\
x1a\x3e\x51\x0b\x41\x11\x58\x17\x4d\x55\x16\x42\x01\x52\x4b\x0f\x5a\x07\x00\x00\x07\x06\
x40\x4d\x07\x5a\x07\x14\x19\x0b\x07\x5a\x4d\x03\x47\x01\x13\x43\x0b\x06\x50\x06\x13\x7a\
x02\x5d\x4f\x5d\x18\x09\x41\x42\x15\x59\x48\x4d\x4f\x59\x1d\x43\x10\x15\x00\x1a\x0e\x17\
x05\x51\x0d\x1f\x1b\x08\x1a\x0e\x03\x1c\x5d\x0c\x05\x15\x59\x55\x09\x0d\x0b\x41\x0e\x0e\
x5b\x10\x5b\x01\x0d\x0b\x55\x17\x02\x5a\x0a\x5b\x05\x10\x0d\x52\x43\x40\x15\x46\x4a\x1d\
x5f\x4a\x14\x48\x4b\x40\x5f\x55\x10\x42\x15\x14\x06\x07\x46\x01\x55\x16\x42\x48\x10\x4b\
x49\x16\x07\x07\x08\x11\x18\x5b\x0d\x18\x50\x46\x5c\x43\x0a\x1c\x59\x0f\x43\x17\x58\x11\
x04\x14\x48\x57\x0f\x0a\x46\x17\x48\x4a\x07\x1a\x46\x0c\x19\x12\x5a\x22\x1f\x0d\x06\x53\
x43\x1b\x54\x17\x06\x1a\x0d\x1a\x50\x43\x18\x5a\x16\x07\x14\x4c\x4a\x1d\x1e";
buf = "";
if(k.length == 9) {
for(i = 0, j = 0; i < func.length; i++) {
c = parseInt(func.charCodeAt(i));
c = c ^ k.charCodeAt(j);
if(++j == k.length) {
j = 0;
}
buf += eval('"' + a(x(c)) + '"');
}
eval(buf);
} else {
$("#cresponse").html("<div class='alert alert-danger'>Invalid creds...</div>");
}
});
function a(h) {
if(h.length != 2) {
h = "\x30" + h;
}
return "\x5c\x78" + h;
}
function x(d) {
if(d < 0) {
d = 0xFFFFFFFF + d + 1;
}
return d.toString(16).toUpperCase();
}
일단 function a와 function x는 16진수로 만들고 \x30머 이런식으로 암호화하는것 같으니까 대충만 보고 그 위에 코드가 뭘하는지 확인해 보았다.
if(k.length == 9) {
for(i = 0, j = 0; i < func.length; i++) {
c = parseInt(func.charCodeAt(i));
c = c ^ k.charCodeAt(j);
if(++j == k.length) {
j = 0;
}
buf += eval('"' + a(x(c)) + '"');
}
eval(buf);
} else {
$("#cresponse").html("<div class='alert alert-danger'>Invalid creds...</div>");
}
대충 보면 k의 길이가 9일때 k의 문자열을 아스키코드로 변환한 뒤에 c에 넣고 j의 값에 해당하는 k와 xor하고 그걸 a와 x로 암호화해서 리턴하는것 같다.
한마디로 말하면 웬만하면 쓰레기 값이 리턴된다는 것이다.
그래서 어떤값을 넣어야 의미있는 값이 리턴될까 생각해보다가 아까 관리자도구로 뜯었을때 있었던 id인 "cresponse"가 생각났다. 그래서 대충 function main()으로 만든 뒤에 k값에 cresponse를 넣고 돌려보았다.
function main() {
var c = "";
var k = "cresponse";
var func = "\x0d\x13\x45\x17\x48\x09\x5e\x4b\x17\x3c\x1a\x1f\x2b\x1b\x7a\x0c\x1f\x66\x0b\
x1a\x3e\x51\x0b\x41\x11\x58\x17\x4d\x55\x16\x42\x01\x52\x4b\x0f\x5a\x07\x00\x00\x07\x06\
x40\x4d\x07\x5a\x07\x14\x19\x0b\x07\x5a\x4d\x03\x47\x01\x13\x43\x0b\x06\x50\x06\x13\x7a\
x02\x5d\x4f\x5d\x18\x09\x41\x42\x15\x59\x48\x4d\x4f\x59\x1d\x43\x10\x15\x00\x1a\x0e\x17\
x05\x51\x0d\x1f\x1b\x08\x1a\x0e\x03\x1c\x5d\x0c\x05\x15\x59\x55\x09\x0d\x0b\x41\x0e\x0e\
x5b\x10\x5b\x01\x0d\x0b\x55\x17\x02\x5a\x0a\x5b\x05\x10\x0d\x52\x43\x40\x15\x46\x4a\x1d\
x5f\x4a\x14\x48\x4b\x40\x5f\x55\x10\x42\x15\x14\x06\x07\x46\x01\x55\x16\x42\x48\x10\x4b\
x49\x16\x07\x07\x08\x11\x18\x5b\x0d\x18\x50\x46\x5c\x43\x0a\x1c\x59\x0f\x43\x17\x58\x11\
x04\x14\x48\x57\x0f\x0a\x46\x17\x48\x4a\x07\x1a\x46\x0c\x19\x12\x5a\x22\x1f\x0d\x06\x53\
x43\x1b\x54\x17\x06\x1a\x0d\x1a\x50\x43\x18\x5a\x16\x07\x14\x4c\x4a\x1d\x1e";
buf = "";
if (k.length == 9) {
for (i = 0, j = 0; i < func.length; i++) {
c = parseInt(func.charCodeAt(i));
c = c ^ k.charCodeAt(j);
if (++j == k.length) {
j = 0;
}
buf += eval('"' + a(x(c)) + '"');
}
console.log(buf);
}else {
$("#cresponse").html("<div class='alert alert-danger'>Invalid creds...</div>");
}
}
function a(h) {
if (h.length != 2) {
h = "\x30" + h;
}
return "\x5c\x78" + h;
}
function x(d) {
if (d < 0) {
d = 0xFFFFFFFF + d + 1;
}
return d.toString(16).toUpperCase();
}
여기서 9글자인 문자열을 찾아보았지만 문자로만 된 9글자는 없고 "sdumbh4ck5"이게 가장 근접한 문자열이었다
그래서 여기서 앞글자나 뒷글자를 뺀 "sdumbh4ck", "dumbh4ck5"이 둘중 하나를 f에 넣으면 먼가 나올꺼라고 생각했다.
sdumbh4ck를 넣었을때는 정말 건질게 단 하나도 없는 쓰레기 값이 나왔다.
dumbh4ck5를 넣으니까 먼가 코드같은게 나와서 vscode에서 정렬시켜 보았다.
if(u == "XorIsNotSooS3cur3") {
if(document.location.href.indexOf("?p=") == -1) {
document.location = document.location.href + "?p=" + u;
}
}
else {
$("#cresponse").html("<div class='error'>Wrong password sorry.")
}
u값이 XorIsNotSooS3cur3이고 URL에 ?p=이 있을때 URL+"?p=" + XorIsNotSooS3cur3를 하라는걸로 보인다.
flag를 얻을 수 있다