빅데이터 응용 보안 - 1주차 (2) 테이블 생성 및 공격 log 서치

준덕이·2021년 4월 6일
0
post-thumbnail
  • 복붙 꿀팁 : 강의노트 내용을 메모장에 복붙하고 메모장에서 cmd로 복붙하자. 메모장에서 복사했는데도 cmd에서 붙여놓기 표시가 안뜨면 hive에 대충 아무거나 입력했다 지우고 나면 붙여넣기 표시가 뜬다.

1. 데이터 셋 업


서버 로그 parsing + column 헤더 설정

hive-contrib 파일은 hive의 버전에 따라 달라진다. 따라서 직접 찾아서 add 해주자.

2. 메인 테이블 생성



고대로 복붙하면 과연 작동할까?

안타깝게도 그렇진 않더라..

에러명을 읽어보면 user를 인식하는데 실패한 것 같다.

쓸데 없는 Exception은 다 제외하고 error명만 구글링을 해보자.

이 포스팅을 참고하면 'Reserved word' 로 인한 에러임을 알 수 있다.

컴퓨터 프로그래밍 언어에서 이미 문법적인 용도로 사용되고 있기 때문에 식별자로 사용할 수 없는 단어
=예약어

즉 저 코드에서 'user'와 'time'은 예약어이기 때문에 포스팅에서 언급하는 것처럼 back quote ( ` ) 로 감싸줘야한다.

따라서 코드를 재구성하면 다음과 같이 될 것이다.

CREATE TABLE apachelog ( 
host STRING,
identity STRING,
`user` STRING,
`time` STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-
|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^
\"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?", "output.format.string" =
"%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s" )
STORED AS TEXTFILE;

위 코드를 입력하고 show tables를 해보면 성공적으로 apachelog 테이블이 추가됨을 확인할 수 있다.

언급되고 있는 contrib.serde2의 serde는 데이터를 hadoop 시스템에 쓸 때 이용하는 인터페이스 중 하나이다.
(serializer / deserializer)

3. 데이터 load


교수님이 주신 log 데이터들을 메모장으로 열면 다음과 같은 형식의 내용을 확인할 수 있다.

66.249.67.3 은 host명이 되고 - - 두 개는 senstive한 field인 identity와 user에 각각 대응되는 것이다.
그 다음으로 time이 오고, GET으로 시작하는 커맨드는 request에 해당된다. request에는 외부에서 어떤 resource에 접근하려고 했는지에 대한 정보가 담겨져 있다.

아래에 있는 302는 300으로 여기서 검색하면 http상에서 무슨 상태를 의미하는지 알 수 있다. 300 단위는 request와 response가 성공한 상태이며, 위 field중에서 status에 해당된다.

5는 size (return 된) , referrer 는 "-" 로 표현되어있다.

이제 데이터를 load하기 위해 커맨드를 입력해보자. 그 전에 콘솔창이 너무 더러우니 Ctrl + L 로 다 지워주고...

성공했다!

강의 노트에는 ApacheLogData\acesss 로 표시돼있는데, 당연히 이건 교수님의 디렉토리가 이렇게 만들어져있으니 되는 것이고, 나는 sample-log1이라는 별도 디렉토리를 만들어 거기에 log데이터들을 저장해서 load한 것이다. command 복붙할 때 주의 하자~

참고로 저장된 디렉토리가 한글이면 꿹뙚쨥뛼을 확인할 수 있으므로 삼가자

4. SQL injection attack


현재까지 apachelog 라는 테이블을 만들었고
해당 테이블의 형식에 맞는 7개의 데이터를 load시킨 상태이다.

sql injection 시, 시스템 콜, 커맨드 등을 sql query문으로 보낼 수 있으므로 이러한 request가 있었는지에 대한 여부를 확인해야 한다.

//sql injection 확인 코드
SELECT * FROM apachelog
WHERE LOWER(request) LIKE '% like %'
OR LOWER(request) LIKE '%select %'
OR LOWER(request) LIKE '% from %'
OR LOWER(request) LIKE '% where %'
OR LOWER(request) LIKE '% if %'
OR LOWER(request) LIKE '% having %'
OR LOWER(request) LIKE '% case %'
OR LOWER(request) LIKE '% when %';

위 코드는 특정 키워드들을 소문자로 검색하여 log내에 핵심 sql 문법들이 존재하고 있었는지를 검색해준다.

앞서 언급한 테이블 형식에 따라 'request'부분을 살펴보면 GET 으로 select 시도가 있었음을 확인할 수 있다.
또한 status는 200으로 해당 request와 response가 성공했음을 알 수 있다.

5. dot dot slash Attack


이름이 뭔가 웃긴데 문자 그대로 .. / 를 이용하여 상위 디렉토리로 가려는 공격을 의미한다.
root 디렉토리 근처의 어떤 디렉토리가 보안에 중요한지 판단(주로 관리자만 접근하는)하여 sql injection과 마찬가지로 keyword 검색을 통해 흔적을 찾을 수 있다.

//dot dot slash 확인 코드
SELECT * FROM apachelog
 WHERE LOWER(request) LIKE '%usr/%'
 OR LOWER(request) LIKE '%~/%'
 OR LOWER(request) LIKE '%.exe%'
 OR LOWER(request) LIKE '%.ini%'
 OR LOWER(request) LIKE '%usr/%'
 OR LOWER(request) LIKE '%etc/%'
 OR LOWER(request) LIKE '%dev/%'
 OR LOWER(request) LIKE '%opt/%'
 OR LOWER(request) LIKE '%root/%'
 OR LOWER(request) LIKE '%sys/%'
 OR LOWER(request) LIKE '%boot/%'
 OR LOWER(request) LIKE '%mnt/%'
 OR LOWER(request) LIKE '%proc/%'
 OR LOWER(request) LIKE '%sbin/%'
 OR LOWER(request) LIKE '%srv/%'
 OR LOWER(request) LIKE '%var/%'
 OR LOWER(request) LIKE '%c:\%'
 OR LOWER(request) LIKE '%..%';

마찬가지로 request문을 보면 상위 디렉토리로 올라가서 패스워드파일을 획득하려는 2번의 시도가 보인다. 또한 두번다 404 에러가 발생했음을 알 수 있다.

이처럼 etc 에 접근하는 것은 가장 일반적인 해커들의 수단 중 하나이다.

반면 윈도우 쓰시는 분 거는 200이 뜬 것으로 보아 시원하게 털리지 않았을까 접근이 성공한 것으로 보인다. 물론 이 데이터가 공격 성공으로 판단하기엔 근거가 아직 부족하다고 생각한다.

profile
호쾌함과 진지함 그 사이에 있습니다.

0개의 댓글