In this write up, some hints related to this challenge only will be mentioned.
여기서는 챌린지와과 관련된 몇 가지 힌트만이 언급됩니다.
Level16
About
There is a perl script running on port 1616.
관련 사항.
1616 포트에서 동작하는 Perl 스크립트 프로그램이 존재한다.
To do this level, log in as the level16 account with the password level16. Files for this level can be found in /home/flag16.
level16(pw: level16) 계정을 이용한다. 관련 파일은 /home/flag03에 있다.
Source code 소스코드.
About
There is a perl script running on port 1616.
관련 사항.
1616 포트에서 동작하는 Perl 스크립트 프로그램이 존재한다.
To do this level, log in as the level16 account with the password level16. Files for this level can be found in /home/flag16.
level16(pw: level16) 계정을 이용한다. 관련 파일은 /home/flag03에 있다.
Source code 소스코드.
#!/usr/bin/env perl
use CGI qw{param};
print "Content-type: text/html\n\n";
sub login {
$username = $_[0];
$password = $_[1];
$username =~ tr/a-z/A-Z/; # conver to uppercase
$username =~ s/\s.*//; # strip everything after a space
@output = `egrep "^$username" /home/flag16/userdb.txt 2>&1`;
foreach $line (@output) {
($usr, $pw) = split(/:/, $line);
if($pw =~ $password) {
return 1;
}
}
return 0;
}
sub htmlz {
print("<html><head><title>Login resuls</title></head><body>");
if($_[0] == 1) {
print("Your login was accepted<br/>");
} else {
print("Your login failed<br/>");
}
print("Would you like a cookie?<br/><br/></body></html>\n");
}
htmlz(login(param("username"), param("password")));
use CGI qw{param};
print "Content-type: text/html\n\n";
sub login {
$username = $_[0];
$password = $_[1];
$username =~ tr/a-z/A-Z/; # conver to uppercase
$username =~ s/\s.*//; # strip everything after a space
@output = `egrep "^$username" /home/flag16/userdb.txt 2>&1`;
foreach $line (@output) {
($usr, $pw) = split(/:/, $line);
if($pw =~ $password) {
return 1;
}
}
return 0;
}
sub htmlz {
print("<html><head><title>Login resuls</title></head><body>");
if($_[0] == 1) {
print("Your login was accepted<br/>");
} else {
print("Your login failed<br/>");
}
print("Would you like a cookie?<br/><br/></body></html>\n");
}
htmlz(login(param("username"), param("password")));
(1) @output = `egrep "^$username" /home/flag16/userdb.txt 2>&1`;
(2) `egrep "^$username" /home/flag16/userdb.txt 2>&1`;
(3) egrep "^$username" /home/flag16/userdb.txt 2>&1
(4) egrep "^`■■■■■■■■`" /home/flag16/userdb.txt 2>&1
I have listed the order in which the original appearance of the target code is interpreted when it is recognized and executed as a shell command.
공격할 코드의 원래 모습이 쉘 명령어로 인식되어 실행될 때 어떻게 해석되는지를 순서대로 나열해보았다.
(1) It is the appearance of the code to attack.
(1) 공격할 코드의 모습이다.
(2) Focused on code related to shell commands.
(2) 쉘 명령어와 관련된 코드에 초점을 맞추었다.
(3) The Perl grammar recognizes strings enclosed in backquotes(`) as commands to be passed to the shell. So the range of strings to be passed to the shell is like this.
(3) Perl 문법은 백쿼트(`)로 둘러싸인 문자열을 쉘에 넘길 명령어로 인식한다. 이에 따라 쉘에 전달될 문자열의 범위는 이렇게 된다.
(4) Assumed situation a malicious string in the range.
(4) 해당 범위에서 악성 문자열이 들어갈 때를 가정한다.
level16@nebula:/tmp$ ls -al
……
-rwxrwxrwx 1 level16 level16 31 2019-06-19 01:29 EXPLOIT
-rw-r--r-- 1 flag16 flag16 59 2019-06-19 01:30 rst
……
level16@nebula:/tmp$ cat ./rst
You have successfully executed getflag on a target account
……
-rwxrwxrwx 1 level16 level16 31 2019-06-19 01:29 EXPLOIT
-rw-r--r-- 1 flag16 flag16 59 2019-06-19 01:30 rst
……
level16@nebula:/tmp$ cat ./rst
You have successfully executed getflag on a target account