¾²·¹µå¸¦ »ç¿ëÇÑ Æ÷Æ® ½ºÄµ ÇÁ·Î±×·¥




by Beist Security Study Group
(http://beist.org)

Members of Beist Research Group : beist and anonymous people
Members of Beist Study Group : beist, dars21, obhacker, passion, p-jackpot, jacaranda, cina





¿ä¾à: ¾²·¹µå¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥À» º´·ÄÀûÀ¸·Î ÀÛ¼ºÇÒ °æ¿ì ¿øÇÏ´Â ±â´ÉÀ» º¸´Ù ºü¸£°Ô ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. º» ¹®¼­´Â ¾²·¹µå¸¦ ÀÌ¿ëÇÑ Æ÷Æ® ½ºÄµ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °úÁ¤À» ´ã¾Ò½À´Ï´Ù. À̸¦ Ȱ¿ëÇÒ °æ¿ì ¾²·¹µå¸¦ »ç¿ëÇÏÁö ¾ÊÀº Æ÷Æ® ½ºÄµº¸´Ù ÈξÀ ´õ ºü¸£°Ô ½ºÄµ ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ°í Æ¯È÷ ±¤¹üÀ§ÇÑ IP ´ë¿ªÀ» ½ºÄµÇϰųª ÇÒ ¶§ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.










1. ¼Ò°³

 

¾²·¹µå »ý¼ºÀº ÇÁ·Î¼¼½º »ý¼º¿¡ ºñÇØ ½Ã½ºÅÛ ÀÚ¿øÀ» ¸¹ÀÌ ¼ÒºñÇÏÁö ¾Ê°í °¡º±°Ô µ¿ÀÛÇϱ⠶§¹®¿¡ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼­ ´ÙÁß Á¢¼ÓÀ» ó¸® ÇÒ ¶§³ª ÇÁ·Î¼¼¼­ ³»ÀÇ µ¿ÀÏ ÀÛ¾÷À» º´·ÄÀûÀ¸·Î ó ¸®ÇÒ ¶§ ¸¹ÀÌ »ç¿ëµÇ´Â ±â¹ýÀÔ´Ï´Ù.

Port Scan ÀÛ¾÷Àº ¸ñÇ¥ ³×Æ®¿öÅ©¸¦ °ø·«Çϱâ À§ÇÑ Áß¿äÇÑ ÀÛ¾÷ Áß¿¡ ÇϳªÀε¥ ³×Æ®¿öÅ© ȯ°æ¿¡ µû¶ó Scan ÀÛ¾÷ÀÌ ±²ÀåÈ÷ ¿À·¡ °É¸®´Â °æ¿ì°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù . ƯÈ÷ Å« ´ë¿ªÀ» ScanÇÒ ¶§ µî ¾ÆÁÖ ¸¹Àº Port¸¦ °Ë»öÇÒ ¶§ ¹®Á¦°¡ µÉ ¼ö ÀÖ½À´Ï´Ù. º» ¹®¼­´Â ÀÌ·¯ÇÑ ¹®Á¦Á¡À» ±Øº¹Çϱâ À§ÇÑ ¹æ¾ÈÀ¸·Î ¾²·¹µå¸¦ Port Scan¿¡ µµÀÔÇÏ´Â ³»¿ë¿¡ ´ëÇØ¼­ ´Ù·ê °ÍÀÔ´Ï´Ù. ¶ÇÇÑ º» ¹®¼­´Â Port Scan¿¡ ¾²·¹µå ±â´ÉÀ» µµÀÔÇÏ¿© Scan ½Ã°£À» ³¶ºñÇÏÁö ¾Êµµ·Ï ÇÏ´Â °ÍÀÌ ¸ñÇ¥À̹ǷΠ¸¹Àº ³»¿ëÀ» ´Ù·çÁö ¾Ê°í Scan ÀÛ¾÷¿¡ Á÷Á¢ÀûÀ¸·Î °ü·ÃµÈ ¾²·¹µå¸¸À» ¼³¸íÇÒ °ÍÀÔ´Ï´Ù.

 

 

 

 

2. ±â¼úÀûÀÎ ³»¿ë

 

(1)  ¾²·¹µå¶õ

 

¾²·¹µå´Â ÈçÈ÷ °æ·® ÇÁ·Î¼¼½º, ¼¼¹Ì ÇÁ·Î¼¼½º¶ó ÁöĪÇϴµ¥, ÇÁ·Î±×·¥¿¡¼­ ¼öÇàÇÏ´Â ¸í·ÉÀÇ È帧À» µ¿½Ã¿¡ ó¸®Çϵµ·Ï ÇÏ´Â °ÍÀÌ °¡Àå Å« Ư¡ÀÔ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î¼¼½ºÀÇ °æ¿ì ÇÁ·Î±×·¥ ¸í·ÉµéÀÌ ´ÜÀÏÀûÀ¸·Î ȤÀº ¼øÂ÷ÀûÀ¸·Î 󸮵ÇÁö¸¸, ¾²·¹µå¸¦ »ç¿ëÇÏ°Ô µÇ¸é ÇÁ·Î±×·¥ ¸í·ÉµéÀ» º´·ÄÀûÀ¸·Î ó¸®ÇÒ ¼ö Àֱ⠶§¹®¿¡ ¸Å¿ì ºü¸¥ ¼Óµµ·Î µ¿ÀÛÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î ¼öÇàÇØ¾ß ÇÒ ÀÛ¾÷ÀÌ ¸¹Àº ÇÁ·Î±× ·¥ÀÏ °æ¿ì ¾²·¹µå »ç¿ë ¿©ºÎ¿¡ µû¶ó ó¸® ¼Óµµ°¡ ´ë·« ½º¹« ¹è ÀÌ»ó Â÷À̰¡ ³¯ ¼ö ÀÖ½À´Ï´Ù. À̿ܿ¡µµ ¾²·¹µå °£¿¡´Â °øÀ¯ ¸Þ¸ð¸® °ø°£À» °®°í Àֱ⠶§¹®¿¡ ÇÁ·Î±×·¥ ±¸ÇöÀÌ Æí¸®ÇÏ´Ù´Â ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù.

¾²·¹µåÀÇ ´ÜÁ¡À¸·Î, ÀÛ¾÷À» ¼öÇàÇÏ´Â µµÁß, µ¿½Ã¿¡ ƯÁ¤ ¸Þ¸ð¸®¿¡ Á¢±ÙÇßÀ» ¶§ ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼öµµ ÀÖ½À´Ï´Ù. ¶Ç µ¿ÀÛÁßÀÎ ¿©·¯ °³ÀÇ ¾²·¹µå Áß Çϳª¶óµµ À߸øµÈ ¿¬»êÀ» ÇÏ°Ô µÉ °æ¿ì ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ ÇÁ·Î¼¼½º Àüü°¡ Á×°Ô µË´Ï´Ù. ±×¸®°í, ¿©·¯ ¸í·ÉÀÌ µ¿½Ã¿¡ ½ÇÇàµÇ±â ¶§¹®¿¡ µð¹ö±ë ÀÛ¾÷ÀÌ ¾î·Æ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù.

 

(2)  ¾²·¹µå API

 

º» ¹®¼­¿¡¼­ ´Ù·ç°Ô µÉ ¾²·¹µå API´Â POSIX ¾²·¹µåÀε¥ ¿î¿µÃ¼Á¦¿¡ °ü°è¾øÀÌ »ç¿ëµÉ ¼ö Àִ ȣȯ¼ºÀÌ ÁÁÀº ¶óÀ̺귯¸®·Î pthread(Posix ThreadÀÇ ÁÙÀÓ¸»)ÀÔ´Ï´Ù.

 

1)    ¾²·¹½º »ý¼º  

 

#include<pthread.h>

 

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);

 

thread : ¾²·¹µå ½Äº°ÀÚ. ´Ù¸¥ ¾²·¹µå¿Í ±¸ºÐµÉ ¼ö ÀÖ´Â ID¸¦ ÇÒ´ç¹Þ°Ô µË´Ï´Ù.

attr : »ý¼ºµÇ´Â ¾²·¹µåÀÇ Æ¯¼ºÀ» Á¤Çϱâ À§ÇØ »ç¿ëµÇ´Âµ¥, ÀϹÝÀûÀ¸·Î NULLÀ» »ç¿ëÇÕ´Ï´Ù.

start_routine : ¸®ÅÏ Å¸ÀÔÀÌ void*À̰í ÀÎÀÚµµ void*ÀÎ ÇÔ¼ö Æ÷ÀÎÅÍ·Î ¾²·¹µå°¡ ½ÇÇà½Ãų¾²·¹µå ÇÔ¼öÀÔ´Ï´Ù.

arg : ¾²·¹µå¿¡ ÀÇÇØ È£ÃâµÇ´Â ÇÔ¼ö(start_routine Æ÷ÀÎÅÍ¿¡ ´ëÀÔµÈ ÇÔ¼ö)¿¡ ÀüµÉµÇ´Â ÇÔ¼ö ÀÎÀÚ ÀÔ´Ï´Ù.

 

ÀÌ ÇÔ¼ö¿¡¼­ Áß¿äÇÑ ÀÎÀÚ´Â ¾²·¹µå ½Äº°ÀÚ(thread)¿Í, ¾²·¹µå »ý¼º½Ã È£ÃâµÇ´Â ÇÔ¼ö(start_routine)ÀÔ´Ï´Ù.

 

 

2) ¾²·¹µå ±â´Ù¸²

 

#include<pthread.h>

 

int pthread_join(pthread_t th, void **thread_return);

 

th : ¾²·¹µå°¡ Á¾·áÇÒ ¶§±îÁö ±â´Ù¸®´Â ¾²·¹µå ½Äº°ÀÚÀÔ´Ï´Ù.

thread_return : ¾²·¹µå°¡ Á¾·á½Ã ¹ÝȯÇÏ´Â °ª¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â Æ÷ÀÎÅÍÀÔ´Ï´Ù.

 

»ý¼ºµÈ ¾²·¹µå°¡ Á¾·áµÉ ¶§±îÁö ±â´Ù¸®±â À§ÇÑ ÇÔ¼öÀÔ´Ï´Ù. ¸¸¾à ÇÁ·Î¼¼½º°¡ ¾²·¹µå¸¦ »ý¼ºÇÑ ÈÄ¿¡ ¾²·¹µå°¡ Á¾·áÇÒ ¶§±îÁö ±â´Ù¸®Áö ¾Ê°í ÇÁ·Î¼¼½º¸¦ Á¾·áÇÏ¸é ¾²·¹µåµµ µ¿½Ã¿¡ ¸ðµÎ Á¾·áµÇ±â ¶§¹®¿¡ ¸ðµç ¾²·¹µå¸¦ ¾ÈÀüÇÏ°Ô ½ÇÇà½Ã۱â À§Çؼ­ ¹Ýµå½Ã »ç¿ëµÇ¾î¾ß ÇÏ´Â ÇÔ¼ö ÀÔ´Ï´Ù.

 

3) ¾²·¹µå ½Äº°ÀÚ ¹Ýȯ

 

#include<pthread.h>

 

int pthread_self();

 

pthread_self ÇÔ¼ö¸¦ ½ÇÇàÇϸé ÇØ´ç ¾²·¹µåÀÇ ½Äº°ÀÚ¸¦ ¹ÝÈ¯ÇØÁÝ´Ï´Ù.

 

 

 

4) ¾²·¹µå ºÐ¸®

 

#include<pthread.h>

 

int pthread_detach(pthread_t th);

 

th : ¸ÞÀÎ ¾²·¹µå¿¡¼­ ºÐ¸®ÇÒ ¾²·¹µå ½Äº°ÀÚÀ̰í, ¾²·¹µå°¡ ºÐ¸®µÇ¸é Á¾·áµÇ¸é¼­ ÀÚ¿øÀ» Áï½Ã ÇØÁ¦½ÃÄÑ ÁÝ´Ï´Ù.

 

5) ¾²·¹µå Á¾·á

 

#include<pthread.h>

 

int pthread_exit(void *retval);

 

ÇöÀç ½ÇÇà ÁßÀÎ ¾²·¹µå¸¦ Á¾·á½Ãų ¶§ »ç¿ëµÇ´Â ÇÔ¼öÀÔ´Ï´Ù. Á¾·á ÈÄ¿¡ pthread_joinÇÔ¼ö¸¦ ÅëÇÏ¿© ¸ðµç ÀÚ¿øÀ» ÇØÁ¦ ½Ãŵ´Ï´Ù.

 

 

(3) ¾²·¹µå µ¿±âÈ­ API

 

¾²·¹µå´Â ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡¼­ ³ª´µ¾îÁø °ÍÀ¸·Î µ¥ÀÌÅ͸¦ °øÀ¯ÇÒ ¼ö ÀÖ´Ù°í ÇÏ¿´½À´Ï´Ù. ¿©·¯ °³ÀÇ ¾²·¹µå°¡ Àü¿ª º¯¼ö¿¡ Á¢±ÙÇÏ´Â °æ¿ì¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö Àִµ¥ À̰ÍÀ» ÀÓ°è ¿µ¿ª(Critical Section)À¸·Î º¼ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¹®¼­¿¡¼­´Â ¹ÂÅØ½º(mutex)¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅÍ µ¿½Ã Á¢±Ù ¹®Á¦¸¦ ÇØ°áÇÕ´Ï´Ù. ¹ÂÅØ½º¸¦ Áö¿øÇÏ´Â pthreadÀÇ ÇÔ¼ö¸¦ ¾Ë¾Æº¸°Ú½À´Ï´Ù.

 

#include<pthread.h>

 

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

 

int pthread_mutex_lock(pthread_mutex_t *mutex);

 

int pthread_mutex_unlock(pthread_mutex_t *mutex);

 

int pthread_mutex_destroy(pthread_mutex_t *mutex);

 

 

 pthread_mutex_init : ¹ÂÅØ½º¸¦ »ç¿ëÇϱâ Àü¿¡ ÃʱâÈ­ °úÁ¤À» °ÅÄ¡±â À§ÇÑ ÇÔ¼öÀÔ´Ï´Ù. ù ¹øÂ° ÀÎÀÚ¿¡´Â ÃʱâÈ­ÇϰíÀÚ ÇÏ´Â ¹ÂÅØ½º Æ÷ÀÎÅ͸¦ ³Ñ±â°í, µÎ ¹øÂ° ÀÎÀÚ¿¡´Â ¹ÂÅØ½º ¼Ó¼º(attribute)¸¦ ¼³Á¤ÇÒ ¶§ »ç¿ëÇÕ´Ï´Ù. ¼Ó¼ºÀ» »ç¿ëÇÏÁö ¾ÊÀ» ¶§´Â NULLÆ÷ÀÎÅ͸¦ ³Ñ±é´Ï´Ù.

pthread_mutex_lock : ¹ÂÅØ½º¸¦ °É¾î Àá±Û ¶§(lock) »ç¿ëÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ¹ÂÅØ½º¸¦ °É¾î Àá±×¸é ÈÄ¿¡ ÁøÀÔÇÏ´Â ¾²·¹µå´Â ¹ÂÅØ½º°¡ Ç®¸± ¶§±îÁö ´ë±âÇÏ°Ô µË´Ï´Ù.

pthread_mutex_unlock : ¹ÂÅØ½º¸¦ Ç®¾îÁÙ ¶§ »ç¿ëÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ¹ÂÅØ½º¸¦ Àá±×¸é ¹Ýµå½Ã Ç®¾îÁà¾ß ´Ù¸¥ ¾²·¹µåµéÀÌ ÁøÀÔÇÒ ¼ö ÀÖ½À´Ï´Ù.

pthread_mutex_destroy : ´õ ÀÌ»ó ¹ÂÅØ½º¸¦ »ç¿ëÇÏÁö ¾Ê°í ÀÌ¿Í °ü·ÃµÈ ¸®¼Ò½º¸¦ ÇØÁ¦ÇÒ ¶§ »ç¿ëµÇ´Â ÇÔ¼öÀÔ´Ï´Ù.

 

(4) ¸ÖƼ ¾²·¹µå ±¸Çö ¿¹ (Æ÷Æ®½ºÄµ ÇÁ·Î±×·¥)

 

¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¡¹Ö ¸ðµ¨Àº ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼­ äÆÃ ¼­¹ö µî, ´ÙÁß Á¢¼Ó 󸮸¦ À§ÇÑ ¸ñÀûÀ¸·Î ¸¹ÀÌ »ç¿ëµË´Ï´Ù. º» ¹®¼­¿¡¼­´Â À̰ÍÀ» ÀÀ¿ëÇÏ¿© ¸ñÇ¥ ¼­¹öÀÇ Æ÷Æ®(65535°³) Áß¿¡ ¾î¶² Æ÷Æ®°¡ ¿­·ÁÀÖ´ÂÁö ºü¸¥ ½Ã°£ ¾È¿¡ È®ÀÎÇÒ ¼ö ÀÖ´Â Æ÷Æ®½ºÄµ ÇÁ·Î±×·¥À» Á¦ÀÛÇÏ´Â °úÁ¤À¸·Î ¿¹¸¦ µé¾î ¼³¸íÇϰڽÀ´Ï´Ù .

¿¹Á¦ ÇÁ·Î±×·¥ÀÎ Æ÷Æ®½ºÄµ ÇÁ·Î±×·¥¿¡¼­ 65535°³ÀÇ Æ÷Æ®¸¦ º´·ÄÀûÀ¸·Î °Ë»öÇϱâ À§ÇØ ¸ÖƼ ¾²·¹µå¸¦ »ç¿ëÇÕ´Ï´Ù. ½Ã½ºÅÛ ÀÚ¿øÀÇ ÇÑ°è ¹®Á¦Á¡À¸·Î ÀÎÇØ ÀϹÝÀûÀ¸·Î ÇÁ·Î¼¼½º´ç ¾²·¹µå »ý¼º°³¼ö°¡ Á¦ÇѵǾî ÀÖ½À´Ï´Ù. ¶ÇÇÑ °úµµÇÑ ¾²·¹µå¸¦ »ý¼ºÇÒ °æ¿ì ÇÁ·Î±×·¥ÀÌ Á¤»óÀûÀ¸·Î ÀÛµ¿µÇÁö ¾Ê´Â °æ¿ì°¡ Àִµ¥ º» ¹®¼­¿¡¼­´Â ÀÌ ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇØ ¾²·¹µå¸¦ »ý¼ºÇÑ ÈÄ, ¾²·¹µå »ý¼º°³¼ö(thread_cont)¸¦ Áõ°¡½ÃŰ´Â ºÎºÐÀ» ÀӰ迵¿ªÀ¸·Î ÁöÁ¤ÇÏ°í ¹ÂÅØ½º Àá±ÝÀ» ÅëÇØ Á¦ÇÑµÈ ¼ö(1000°³)¸¦ ³ÑÁö ¾Êµµ·Ï Çϰí ÀÖ½À´Ï´Ù. (1000°³ ¼öÄ¡´Â ½Ã½ºÅÛ¸¶´Ù À¯¿¬ÇÏ°Ô ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.)

¸ÞÀÎ ÇÔ¼ö¿¡ ´ëÇÑ ³»¿ëÀº »ý·«ÇÏ°í ¾²·¹µå¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö¿Í ¾²·¹µå¿¡¼­ ½ÇÇàÇÒ ³»¿ë¿¡ ´ëÇØ¼­¸¸ ¼³¸íÇϰڽÀ´Ï´Ù. ¸ÞÀÎ ÇÔ¼öÀÇ ¿ªÇÒÀº ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¶§ ÀÔ·ÂÇÏ´Â ¸í·É Àμö·ÎºÎÅÍ(argument) ¸ñÇ¥ ½Ã½ºÅÛÀÇ IPÁÖ¼Ò¸¦ ¾ò¾î¿Í thread_scan(¾²·¹µå¸¦ »ý¼ºÇÒ ÇÔ¼ö) ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °Í ÀÔ´Ï´Ù.

 

1

2 #define ENDPORT 65535

3 int thread_count; //¾²·¹µå »ý¼º °³¼ö¸¦ ³ªÅ¸³»´Â º¯¼ö

4 int dst_ip; //½ºÄµ´ë»ó ip

5 int flag = 1;

6

7 void thread_scan()  //¾²·¹µå¸¦ »ý¼ºÇÒ ÇÔ¼ö

8 {

9            int i, start_port;

10          pthread_t thread_id[ENDPORT];   

11          void* t_return;

12          int value[ENDPORT];

13          struct sockaddr_in sock;

14      if(pthread_mutex_init(&mutex, NULL)) fprintf(stderr, "mutex init error\n");

15          printf("\nStart PortScan..........\n");

16          printf("port\tstate\n");

17          for(i=0, start_port = 0;i<ENDPORT;i++){      

18                        value[i]=++start_port;

19      pthread_mutex_lock(&mutex);

20          while(1){

21      if(thread_count < 1000){

22       if(pthread_create(&thread_id[i], NULL, tcpportscan, (void*)&value[i])<0)

23                                     fprintf(stderr, "create error\n");

24                                thread_count++;

25                                     break;

26          }

27          else{

28                                     usleep(10);

29                                     continue;

30          } // if(thread_count<1000)

31          } // while()

32          pthread_mutex_unlock(&mutex);

33          } //for

34          if(flag)

35                                     printf("All port close..........\n");

36 }

37

38

39  void *tcpportscan(void* arg) //¾²·¹µå¿¡¼­ ½ÇÇàÇÒ ÇÔ¼ö

40  {

41          struct sockaddr_in dest; //¼ÒÄÏ ¾îµå·¹½º

42          int sockfd; //¼ÒÄÏ µð½ºÅ©¸³Æ®

43          int scanport;

44          int value;

45          int Error, ErrorLength;

46          struct timeval tv;

47          fd_set readfd, writefd;

48          pthread_t th;

49          th = pthread_self();

50          scanport= *(int*)arg;

51          memset((char*)&dest, 0, sizeof(dest));

52          dest.sin_family = AF_INET;

53          dest.sin_port = htons(scanport);

54          dest.sin_addr.s_addr = htonl(dst_ip);

55

56          if((sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0){

57                        fprintf(stderr, "¼ÒÄÏ¿¡·¯\n");

58                        close(sockfd);

59                        pthread_detach(th);

60          }

61          value = fcntl(sockfd, F_GETFL);

62          fcntl(sockfd, F_SETFL, value | O_NONBLOCK);

63          if(connect(sockfd, (struct sockaddr *)&dest, sizeof(dest)) == 0){

64                        printf("connect¿¡·¯");                     

65                        close(sockfd);

66                        pthread_detach(th);

67          }

68          //select ŸÀӾƿô ¼³Á¤

69          tv.tv_sec = 2; //´ë±â½Ã°£ 2ÃÊ ¼³Á¤

70          tv.tv_usec = 0;

71      //select¿¡¼­ °Ë»çÇÏ´Â µð½ºÅ©¸³Æ® ¼³Á¤

72          FD_ZERO(&readfd);

73          FD_ZERO(&writefd);

74          FD_SET(sockfd, &readfd);

75          FD_SET(sockfd, &writefd);

76

77          if(select(sockfd+1, &readfd, &writefd, NULL, &tv) <= 0) ;

78     else{

79        if(FD_ISSET(sockfd, &readfd) || FD_ISSET(sockfd, &writefd)){

80                        ErrorLength = sizeof(Error);

81     if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &Error, &ErrorLength) == 0) {

82                                     if(Error == 0){

83                 & nbsp;             flag = 0; //¿­¸° Æ÷Æ® ÀÖ´Ù´Â flag ¼³Á¤

84                                      &nb sp;            printf("%d\topen\n", scanport);             

85                                     }                                     

86      }//getsock

87              }//fd_isset

88     }//else

89          close(sockfd);

90      thread_count--;

91      pthread_detach(th);

92 }

 

 

 

ÇÁ·Î±×·¥ ÇØ¼³

 

2Çà : ÃÖ´ë Æ÷Æ®ÀÇ ÇÒ´ç °³¼ö°¡ 65535À̹ǷΠ°Ë»öÆ÷Æ®ÀÇ °³¼ö¸¦ 65535°³·Î ÁöÁ¤Çϰí ÀÖ½À´Ï´Ù.

4Çà~5Çà : ¸ðµç ¾²·¹µå¿¡¼­ ÂüÁ¶ ÇÒ ¼ö ÀÖµµ·Ï ½ºÄµ ´ë»ó È£½ºÆ® IP¸¦ Àü¿ª¹ø¼ö·Î ¼±¾ðÇϰí, °Ë»öµÈ Æ÷Æ®°¡ ¾øÀ» ¶§ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇØÁÖ±â À§ÇÑ flag¸¦ ¼±¾ðÇÕ´Ï´Ù.

14Çà : µ¿±âÈ­¿¡ ÇÊ¿äÇÑ ¹ÂÅØ½º¸¦ »ç¿ëÇϱâ À§ÇØ pthread_initÇÔ¼ö¸¦ È£ÃâÇϰí ÀÖ´Ù.

17Çà~33Çà : for¹®À» ÅëÇØ 65535±îÁö port¹øÈ£¸¦ ´ëÀÔÇÏ´Â °úÁ¤À» ¹Ýº¹ÇÕ´Ï´Ù.

ÇÑ ÇÁ·Î¼¼½ºÀÇ ¾²·¹µå »ý¼º °³¼ö°¡ Á¦ÇѵǾî Àֱ⠶§¹®¿¡ ¹«Á¦ÇÑÀ¸·Î ¾²·¹µå¸¦ »ý¼ºµÇ´Â °Í

À» ¹æÁöÇϱâ À§ÇØ ¹ÂÅØ½º¸¦ »ç¿ëÇÕ´Ï´Ù. for¹® ½ÃÀÛ ºÎºÐ¿¡¼­ ¹ÂÅØ½º Àá±ÝÇÔ¼öÀÎ pthread

_mutex_lockÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÀӰ迵¿ªÀ¸·Î ¼³Á¤ÇÏ°í ¾²·¹µå »ý¼º°³¼ö°¡ 1000°³ ÀÌÇÏÀÎÁö

¸¦ üũÇÕ´Ï´Ù. ¸¸¾à ¾²·¹µå »ý¼º°³¼ö°¡ 1000°³ ÀÌÇÏÀ̸é pthread_createÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿©

 ¾²·¹µå¸¦ »ý¼ºÇÏ°í ¼¼ ¹øÂ° ÀÎÀÚ¿¡ ½ÇÇàµÉ ¾²·¹µå ÇÔ¼ö·Î tcpportscanÇÔ¼ö¸¦ ´ëÀÔÇÏ¿´½À

´Ï´Ù. ¶ÇÇÑ, tcpportscanÇÔ¼ö¿¡ ÇÒ´çµÉ ÀÎÀڷδ value¹è¿­ÀÇ °ªÀ¸·Î ´ëÀÔÇÏ¿´½À´Ï´Ù.

¾²·¹µå¸¦ »ý¼ºÇÏ°í ³­ ÈÄ¿¡´Â pthread_mutex_unlockÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¹ÂÅØ½º Àá±ÝÀ» Ç®¾î

ÁÝ´Ï´Ù.

¹Ý¸é¿¡ ¾²·¹µå »ý¼º°³¼ö°¡ 1000°³¸¦ ³Ñ°Ô µÇ¸é ´Ù¸¥ ¾²·¹µå¿¡¼­ ¾²·¹µå°¡ Á¾·áµÉ ¶§±îÁö

±â´Ù¸®µµ·Ï ÇÕ´Ï´Ù.

34Çà~35Çà : ¿­·ÁÀÖ´Â Æ÷Æ®°¡ ¾øÀ» °æ¿ì Ãâ·ÂÇØÁÖ´Â ¸Þ½ÃÁöÀÔ´Ï´Ù.

39Çà : ¾²·¹µå ¸¶Áö¸· ºÎºÐ¿¡¼­ pthread_detachÇÔ¼öÀÇ ÀÎÀÚ·Î »ç¿ëÇϱâ À§ÇØ ¾²·¹µå ½Äº°ÀÚ¸¦ ¾ò¾î¿À´Â pthread_selfÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.

50Çà : ¾²·¹µå ½ÇÇàÇÒ ÇÔ¼ö(tcpportscan)¸¦ È£ÃâÇÒ ¶§ ³Ñ¾î¿Â ÀÎÀÚ °ªÀ¸·Î port¹øÈ£ÀÔ´Ï´Ù.

56Çà : socketÇÔ¼ö¸¦ ÅëÇØ ¼ÒÄÏ ÆÄÀϵð½ºÅ©¸³Å͸¦ »ý¼ºÇÕ´Ï´Ù.

59Çà, 66Çà, 92Çà : ¾²·¹µå¸¦ Á¾·áÇϰí ÀÚ¿øÀ» ÇØÁ¦Çϱâ À§ÇØ pthread_detachÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.

61Çà~62Çà : fcntl´Â ¼ÒÄÏÆÄÀÏ ÁöÁ¤ÀÚ ÇÔ¼ö·Î F_GETFL¸¦ ÅëÇØ ÆÄÀÏ ÁöÁ¤ÀÚ Ç÷¡±×¸¦ Àоî¿À°í, F_SETFL·Î O_NONBLOCK Ç÷¡±×¸¦ ÁöÁ¤ÇÏ¿© ¼ÒÄÏÀÌ ºí·ÏÅ·µÇÁö ¾Êµµ·Ï ÇÕ´Ï´Ù.

63Çà : connect ÇÔ¼ö¸¦ ÅëÇØ Æ÷Æ®¿¡ ¿¬°á ¿äûÇÕ´Ï´Ù.

69Çà~70Çà :  selectÇÔ¼ö°¡ ±â´Ù¸®´Â ŸÀӾƿô ½Ã°£(2ÃÊ ¼³Á¤)À» ÁöÁ¤ÇÕ´Ï´Ù.

72Çà~75Çà :  FD_·Î ½ÃÀÛÇÏ´Â ÇÔ¼ö´Â ÆÄÀÏ µð½ºÅ©¸³Å͸¦ Á¦¾îÇϱâ À§ÇÑ ÇÔ¼ö·Î, FD_ZERO¸¦ ÅëÇØ ÀԷ°ú Ãâ·ÂÀÇ ÆÄÀÏ µð½ºÅ©¸³ÅÍ Å×À̺íÀ» 0À¸·Î ÃʱâÈ­ Çϰí, FD_SET¸¦ ÅëÇØ ¼ÒÄÏÀ» ÀԷ°ú Ãâ·ÂÀÇ ÆÄÀÏ µð½ºÅ©¸³ÅÍ Å×ÀÌºí¿¡ ¼³Á¤ÇÕ´Ï´Ù.

77Çà : selectÇÔ¼ö¸¦ ÅëÇØ tv±¸Á¶Ã¼ º¯¼ö¿¡ ¼³Á¤µÈ ½Ã°£µ¿¾È ÆÄÀÏ µð½ºÅ©¸³ÅÍ Å×À̺íÀ» °Ë»çÇÕ´Ï´Ù.

78Çà~88Çà : FD_ISSET¸ÅÅ©·Î¸¦ ÅëÇØ ´Ù½Ã Çѹø ¼ÒÄÏÀÇ ÀÔ,Ãâ·ÂÀÇ º¯È­ÀÎÁö È®ÀÎÇÕ´Ï´Ù. ±×¸®°í, getsockoptÇÔ¼ö¿¡ SO_ERROR ¿É¼ÇÀ» ÁöÁ¤ÇØ ¼ÒÄÏ ¿¡·¯ »óŸ¦ ¹ÝÈ¯ÇØÁִµ¥, ¹Ýȯ °ªÀÌ 0À̰í, Errorº¯¼ö¿¡ 0ÀÌ ÇÒ´çµÇ¸é ¿¡·¯°¡ ¾ø´Â °ªÀ̹ǷΠÁ¤»óÀûÀÎ ¼ÒÄÏÀÇ ÀÔ, Ãâ·Â º¯È­¶ó°í ÆÇ´ÜÇÏ°í ¿­·ÁÀÖ´Â Æ÷Æ®¹øÈ£¸¦ Ãâ·ÂÇØÁÝ´Ï´Ù. flagº¯¼ö´Â ¸ðµç Æ÷Æ®°¡ ´ÝÇôÀÖÀ» ¶§ÀÇ Ãâ·Â¹®À» À§ÇÑ º¯¼öÀÔ´Ï´Ù.

 

 

 

 

3. ¸¶Ä¡´Â ¸»

 

Áö±Ý±îÁö ¸ÖƼ ¾²·¹µå¿¡ ´ëÇÑ °³³ä°ú ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÀÀ¿ëÇÏ¿© Æ÷Æ® ½ºÄµ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸¾Ò½À´Ï´Ù. ¿¹Á¦ ÇÁ·Î±×·¥Ã³·³ ¸ÖƼ ¾²·¹µåÀÇ ÀåÁ¡À» Àß È°¿ëÇÏ¿© ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹ÖÀ» ÇÑ´Ù¸é ÇÁ·Î¼¼½º¸¸À¸·Î ½ÇÇàÇÏ´Â ÇÁ·Î±×·¥º¸´Ù ÈÎ ¾À ´õ ÁÁÀº ¼º´ÉÀ» ¹ßÈÖÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥À» ±â´ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¤¹üÀ§ÇÑ IP ´ë¿ªÀ» ScanÇÒ ¶§ ¾²·¹µå¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é ±²ÀåÈ÷ ¿À·£ ½Ã°£ÀÌ °É¸± °ÍÀÔ´Ï´Ù.

¸ÖƼ ¾²·¹µå¸¦ »ç¿ëÇÒ ¶§´Â Ç×»ó °øÀ¯ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â °Í¿¡ ÁÖÀÇÇØ¾ß Çϰí, µ¿±â È­ ¹®Á¦¸¦ Àß °í·ÁÇØ¼­ ÇÁ·Î±×·¡¹ÖÀ» ÇØ¾ß ¾ÈÀüÇÏ°Ô ÀÛµ¿µÉ ¼ö ÀÖ½À´Ï´Ù. º» ¹®¼­¿¡¼­´Â ¾²·¹µå¿¡ ´ëÇÑ ³»¿ëÀ» ¾ÆÁÖ ±âº»ÀûÀÎ ºÎºÐ¸¸ ´Ù·ç¾ú±â ¶§¹®¿¡ ¾²·¹µå¸¦ º¸´Ù ´É¼÷ÇÏ°Ô »ç¿ëÇϱâ À§Çؼ­´Â µð¹ö±ë°ú ½Ç½Ã°£ ½ºÄÉÁÙ¸µ, °í±Þ µ¿±âÈ­, °øÀ¯ ¸Þ¸ð¸®¿¡ ´ëÇØ ´õ¿í ±íÀº ÀÌÇØ°¡ ÇÊ¿äÇÕ´Ï´Ù.

 






¼Ò½º ÷ºÎ: pthread_scan.c
#include<stdio.h> #include<netinet/ip.h> #include<fcntl.h> #include<pthread.h> #define ENDPORT 65535 int dst_ip; int thread_count; int flag = 1; pthread_mutex_t mutex; void *tcpportscan(void* arg); void thread_scan(); int main(int argc, char* argv[]) { int start_ip; if(argc != 2) { fprintf(stderr, "»ç¿ë¹ý:%s IPÁÖ¼Ò\n", argv[0]); fprintf(stderr, "¿¹) %s 192.168.0.1\n", argv[0]); exit(1); } dst_ip = ntohl(inet_addr(argv[1])); thread_scan(); } void thread_scan() { int i, start_port; pthread_t thread_id[ENDPORT]; int value[ENDPORT]; struct sockaddr_in sock; if(pthread_mutex_init(&mutex, NULL)) fprintf(stderr, "mutex init error\n"); printf("\nStart PortScan..........\n"); printf("port\tstate\n"); for(i=0, start_port = 0;i<ENDPORT;i++) { value[i]=++start_port; pthread_mutex_lock(&mutex); while(1) { if(thread_count < 1000) { if(pthread_create(&thread_id[i], NULL, tcpportscan, (void*)&value[i])<0) fprintf(stderr, "create error\n"); thread_count++; break; } else { usleep(10); continue; } } pthread_mutex_unlock(&mutex); } if(flag) printf("All port close..........\n"); } void *tcpportscan(void* arg) { struct sockaddr_in dest; int sockfd; int scanport; int value; int Error, ErrorLength; struct timeval tv; fd_set readfd, writefd; pthread_t th; th = pthread_self(); scanport= *(int*)arg; memset((char*)&dest, 0, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_port = htons(scanport); dest.sin_addr.s_addr = htonl(dst_ip); if((sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0) { fprintf(stderr, "¼ÒÄÏ¿¡·¯\n"); close(sockfd); pthread_detach(th); } value = fcntl(sockfd, F_GETFL); fcntl(sockfd, F_SETFL, value | O_NONBLOCK); if(connect(sockfd, (struct sockaddr *)&dest, sizeof(dest)) == 0) { printf("connect¿¡·¯\n"); close(sockfd); pthread_detach(th); } tv.tv_sec = 2; tv.tv_usec = 0; FD_ZERO(&readfd); FD_ZERO(&writefd); FD_SET(sockfd, &readfd); FD_SET(sockfd, &writefd); if(select(sockfd+1, &readfd, &writefd, NULL, &tv) <= 0) { } else { if(FD_ISSET(sockfd, &readfd) || FD_ISSET(sockfd, &writefd)) { ErrorLength = sizeof(Error); if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &Error, &ErrorLength) == 0) { if(Error == 0) { flag = 0; printf("%d\topen\n", scanport); } } } } close(sockfd); thread_count--; pthread_detach(th); }