본문 바로가기

카테고리 없음

리눅스 보안 실습 2(5,6,7)

728x90

칼리리눅스와 메타스플로잇 2개의 가상머신에서 진행

메티스플로잇 ip 192.168.189.130(공격 대상)

칼리리눅스 ip 192.168.189.129(공격자)

 

요약 열린 포트를 통해서 운영체제 취약점 점검(vsFTP, vnc, ssh, irc, http)

nmap -> search ftp(vsftpd_234_backdoor취약점 사용) -> exploit 공격 -> meterpreter기능 사용

 

#vsFTP(21) 취약점 점검

- 먼저 포트가 열려있는지 nmap 명령어로 vsFTP가 열려 있는 지 확인

 

 - ftp취약점 확인

1. 폴더에서 찾기

2. msfconsole에 들어가서 search ftp로 찾기

침투 성공

 

#vnc(5900) 취약점 점검

-원격 접속을 지원

nmap 확인

search vnc 취약점 확인(vnc_login)

설명을 보면 다양한 컴퓨터에서 vnc 서버를 테스트하고 성공적으로 로그인 가능한 도구다. 관리자 계정에는 기본적으로 null이거나 비어 있거나 누락된 암호가 있는 것을 이용한 취약점이다.

파일 정보에 보면 다음과 같은 파일이 연결되어 있다.

, brute force 공격으로 무차별 공격을 한다. 파일을 살펴보면 무작위로 작성된 파일이 있다.

브루터 포스(brute force) : 무차별적으로 아이디나 비밀번호를 삽입해서 암호를 푸는 공격이다.

- brute force 막는법

암호 인증 횟수에 제한을 두는 것.

vnc가 제대로 로그인됐는지 확인하기 위해서 xtightvncviewer를 사용(vnc 뷰어)

xtightvncviewer ip공격 대상(메타스플로잇2)

 

/usr/share/metasploit-framework/data/wordlists/

 

#ssh(22) 취약점 점검

 

- ssh 서버 우회 방법으로 침투하기

msfconsole에 들어가 search ssh로 최신 취약점을 살펴보자

마운트 : 디바이스와 파일 시스템을 연결하는 리눅스 명령어

막는 방법

umount 명령어를 통해 막아줘야 한다.

showmountNFS/NIS 서버를 마운트한 파일 시스템의 목록을 출력하는 명령어이다.

호스트를 지정하지 않으면, 현재 호스트에서 마운트한 디렉터리의 정보를 출력한다.

showmount 공격 대상 ip

보면 루트가 열려있는데 상대의 모든 파일을 볼 수 있다.(원격지에서 메타스플로잇2의 모든 하드디스크 내용을 볼수 있다)

 

메타스플로잇2와 연결

mount 옵션 t : 파일시스템으로 파일 시스템의 형식을 지정

mount t nfs 명령은 원격 서버의 파일 시스템을 마운트한다. nfs는 시스템 타입

mount -t nfs 메타스플로잇2주소:/ mount_test/

- umount를 하면 파일을 볼 수 없으므로 그 전에 ssh 서비를 할 수 있도록 다뤄야 한다.

ssh에 들어가려면 passwordrsa 키가 필요하다. 들어가는 사람 1개와 서버 1개로 맞으면 인증.

 

리눅스에서 rsa키를 만들 수 있는 명령어가 있다. 위치는 숨겨진 파일로 만들어진다. /root/.ssh/id-rsa이다.

ssh-keygen

- ls -al명령으로 숨겨진 파일까지 보면 .ssh파일을 확인했고 들어가보면 파일이 만들어져 있다.

mount로 상대 하드디스크를 볼 수 있을 때 다음과 같이 ssh key를 만들고 만든 .ssh를 -> 메타스플로잇2의

mount_test/root/.ssh/authorized_keys란 곳에 복사한다.

즉, mount로 뚫은 상태에서 rsa값을 공격 대상의 key값을 인증하는 곳에 키를 복사하면 

다음과 같이 ssh로 접속할 때 키값이 같으므로 다음에 ssh를 통해서 공격 대상 PC에 다시 접속할 수 있게 된다.

mount를 통해서 ssh를 뚫는 경우

 

#irc(6667) 취약점 점검

IRC : 실시간 채팅 프로토콜로 uneral_ircd는 오픈 소스 데몬 트로이 목마 악성코드 침투 방식을 이용한다.

nmap 확인

search irc 

 

#http(8180)/php 취약점 점검

똑같이

php취약점을 이용하자

cgi(Common gateway interface)는 웹서버와 외부 프로그램 사이에서 주고 받는 방법으로 비주억 베이직, 펄 등..옛날에 사용하던 방식이다.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

ch06 크래킹

JtR 도구를 이용한 비밀번호 해독 실습

John the Ripper : JtR 도구는 유닉스 기반의 운영체제에서 비밀번호 강도를 점검하기 위해 사용하는 도구로 무료 암호 해독 소프트웨어다.

여러 암호 크래커를 하나의 패키지로 결합하고 암호 해시 유형을 자동 감지하며 사용자 정의 가능한 크래커를 포함 하므로 가장 자주 사용되는 암호 테스트 및 차단 프로그램 중 하나다.(위키 백과)

유닉스/리눅스 기반의 운영체제는 MD5, SHA-256, SHA-512, DES 방식의 암호화 코드 사용

윈도우 기반의 운영체제는 LM 해시, NTLM 방식의 암호화 코드 사용

 

- 리눅스의 비밀번호는 /etc/passwd파일, /etc/shadow 파일에 암호화해서 저장되어 있다.

윈도우는 c:windows/system32/config/sam파일에 숨겨져 있다.

 

레인보우 테이블 : 존 더 리퍼는 레인보우 테이블을 기반으로 크랙킹 하는데 해시 값에 해당하는 원본 값을 수집한 일종의 사전 정보다.

 

/etc/passwd = root:x:0:0:root:/root:/bin/bash

순서대로 사용자명/패스워드/사용자 계정 uid / gid / 사용자 계정 이름 / 사용자 계정 홈 디렉터리 / 사용자 계정 로그인 쉘

 

/etc/shadow = 사용자명 / 패스워드 / 패스워드 파일 최종 수정일 / 패스워드 변경 최소일 / 패스워드 변경 최대일 / 패스워드 만료 경고기간 / 패스워드 파기 기간

 

- adduser로 유저를 만들고 비밀번호를 각각 다르게 해서 비교해보자

test1, test2, test3

 

john —list=formats 명령은 존 더 리퍼가 지원하는 여러 포맷을 확인

/root/.john/john.pot 명령은 로그가 있는 파일로 지우지 않고 실행하면 도구 사용 시 오류가 발생할 수도 있다.

john --format=crypt passwd

 

- 크래킹한 패스워드를 보여주는 명령

john —show shadow

/usr/share/john/john.conf 존더 리퍼 옵션으로 이를 활용할 수 있다.

/usr/share/john/password.list 파일에 자주 사용하는 패스워드들이 있다.

 

크래킹 성능 향상에 좋은 옵션

single crack mode 가장 빠른 크래킹 기능

wordlist mode 사전파일을 대입하여 크랙 진행[use rules 옵션 지정시 알고리즘 적용(파일 클수록 시간 소요많음)]

incremental 모든 가능한 조합 시도(시간이 많이 걸려 사용하기 힘듦)

External 사용자의 코드를 이용해 융통성있게 시도

 

 

 metasploitable2의 권한 탈취 후 비밀 번호 해독

#시나리오 및 실습 환경

칼리 리눅스 : 192.168.189.129(공격자)

메타스플로잇 : 192.168.189.136(공격 대상)

 

정보 수집(포트 스캔) -> samba 취약점 이용(usermap_script) -> exploit공격 및 권한 탈취 -> meterpreter로(download기능) 패스워드 파일 가져오기 -> john the Ripper로 암호 해독

-> 위쪽은 메타스플로잇터블의 shadow 파일을 미터프리터 download로 칼리로 옮겨왔다.

-칼리 리눅스에서 보면 213shadow.txt를 볼 수 있다.

다음과 같이 root권한에 해당하는 msfadmin을 해독.

only 50cnadidates buffered for the current salt, minimum 96 needed for performance.

버퍼가 부족하다.

현재 크랙된 패스워드를 보자

- pass_crack..john파일을 보면 john.pot 파일이 있다.

여긴 크랙된 패스워드들이 들어 있으며 별도의 해쉬 패스워드들에 대해 로딩 없이 다음번에 재사용할 수 있다.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

ch07 버퍼 오버플로우

버퍼 오버플로우(buffer overflow) : 또는 버퍼 오버런(buffer overrun)은 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점이다.

- 컴퓨터보안과 프로그래밍에서는 프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미하는데 이 벗어난 데이터는 인접 메모리를 덮어 쓰게 되며 이때 다른 데이터가 포함되어 있다면 데이터에 손상을 받을 수 있다.

#엔디안

엔디안(endianness) : 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법이다.[빅엔디언과 리틀 엔디언이 있다] = 정수의 저장 방식

  • 빅 엔디언 - 원래의 순서대로 저장하는 방법 / 큰단위가 앞에 온다.

큰 숫자가 먼저 나타나며, 주로, IBM, Sun, Sparc, 네트워크 주소 등에서 사용한다.

ex) 0x12345678은 저장할 때 원래의 값 순서대로 [12 34 56 78]로 저장(리틀 엔디언과 상반됨)

  • 리틀 엔디언은 정수를 원래의 순서와 반대로 저장하는 방법 / 작은 단위가 앞에 나온다.

ex) 상위 자리의 값이 뒤에 나타나며 [78 56 34 12] 순서로 1바이트씩 저장된다.

 

#버퍼 오버 플로우에 공격에 취약한 함수

= strcpy, strcat, gets, fscanf, scanf, sprintf, sscanf, vfscanf, vsprintf, vscanf, streadd, strecpy, strtrns..등등 이러한 함수들은 문자열의 최대 크기를 정해놓지 않아서 버퍼 오버 플로우 공격에 취약할 수밖에 없다.

 

 - 실습할 편집파일 하나 만들기

nano ./overflow1.c

gcc 컴파일 명령어 : gcc o 실행파일명(*.out) 오브젝트파일명(*.c)

gcc 동작 : 소스 파일 컴파일 -> 오브젝트 파일 생성 -> 실행파일 생성 -> 오브젝트 파일 삭제 순서

-g : 디버거를 하기 위해서 소스코드도 실행파일에 넣어주는 옵션

- 다음과 같이 패스워드 배열을 넘어버리면 인증 성공이 나오는 문제가 생긴다.

 

-gdb 디버거 프로그램을 통해 overflow1내부에서 어ᄄᅠᆫ 일이 일어나는지 확인해보자.

apt-get install gdb

return 0전에 breakpoint를 걸어서 확인한 결과 : 배열이 10개만 만들어진 메모리에 11개의 값이 들어와 메모리가 오버플로우되서 지역변수인 auth의 원래 값인 1이 사라지고 passwd의 오버플로우된 값이 들어가서 1(아스키값 49)이 된것이다.

return 전에 오버플로우 발생

 

 

#대응방법

버퍼가 저장할 수 있는 크기보다 많은 데이터를 입력받지 않는다.

프로그램이 버퍼 밖의 메모리 영역을 참조하지 않는다.

strcpy() 등 오버플로우 위험이 있는 함수의 사용을 자제한다. scanf_s처럼 보안된 함수 사용

버퍼 오버플로우를 막는 최신 os사용

 

# 버퍼 오버플로우 리턴값 변경(PEDA)

DEP 기법(Data Execution Protection) : 실행권한이 없는 메모리 영역의 코드가 실행되지 못하도록 방지하는 기법이다.[스택영역으로 힙 영역의 실행 코드를 방지한다]

ASLR 기법(Address Space Layout Randomization) : 프로세스의 가상 주소가 어떤 공간에 맵핑될 때 그 위치를 프로그램 실행 시 마다 랜덤하게 변경하는 보안기법이다.[윈도우 7,8,10에서 사용중]

 

peda 설치 후 gdb와 연결시켜준다. -> aslr을 중단시켜 스택을 고정 -> gdb에 들어가서 파일을 실행시켜 메모리 이동 자세히 확인 -> pdisas main(어셈블리어로 자세히 보기 오버플로우) -> pattern_create로 위치 찾기 ->  pattern_offset 명령으로 몇 번째인지 확인 -> return address 위치를 찾았으니 그 사이에 hack 프로그램 주소로 옮기기 info func으로 hack의 집 찾기 -> hack 주소를 아스키 코드로 바꾸는 파일을 만들어 저장 후 넣어준다.

 

RBP(base Pointer register)를 알면 버퍼 오버플로우를 통해 주소를 넣어 프로그래밍 할 수있다. - peda사용

-> git clone은 새로운 원격 저장소로 저장하는 명령으로 위의 urlpeda폴더에 복제한다.

- gdbinit 숨김파일로 만들고 “peda.py”를 넣는다. pedagdb를 연결한 것.

- echo는 문자열을 터미널에 출력하는 명령어로 echo1ASLR 실행, echo 0 ASLR을 중단 / 스택을 고정한것

 

 - test용 파일 만듦 - buffer가 100개이고 read로 200개를 읽어 들인다.

지역 변수 포함 메모리 안에 120개가 있다 return address는 8바이트 추가한 128

- gcc fno-stack-protector z execstack ./overflow2.c o test2

fno-stack-protector는 스택보호를 비활성화하는 옵션이며 z execstack은 스택 메모리에 실행권한 부여를 해준다. 경고는 나오지만 실행은 된다.

 

main을 어셈블리코드로 보여주는 명령어

pattern_create 400으로 버퍼 오버플로우가 어디서 났는지 알 수 있다.

여기서 끊겼는데 패턴에서 몇번째인 지 알면 위치를 알 수 있다.

rbp의 시작 주소를 찾기 위해 rsp(현재위치)의 위치를 확인 후 pattern_offset 명령으로 몇 번째인지 확인

그럼 

 

#버퍼 오버 플로우 shell 실행

위의 공간에 쉘코드를 넣는 것.

info func에서 hack 주소를 가져와서 disas main으로