Ⅰ. 개요
실습 과정으로 지난 게시글에 이어 DB서버를 설치하고 WAS서버와 연결한다. Hping3 Tool을 사용해서 DDos공격과 관련한 간단한 실습을 해본다. John Tool을 사용해서 계정 암호를 알아내는 공격 기법을 실습해본다. 또, 간단하게 Injection 공격을 SQL Injection 예시로 알아본다.
Ⅱ. DB
DB서버는 MariaDB를 사용할 예정이다. DB서버를 설치하기 전에 연결할 수 있는 Connector를 Tomcat(WAS)서버에 다운받아주고 환경 변수를 변경해준다. 환경 변수에는 JAVA와 Tomcat 둘 다 등록해준다. 이 부분은 Connector와 같은 라이브러리를 Tomcat과 JAVA가 활용할 수 있게 해주기 위함이다.
※ 환경 변수는 리눅스(ubuntu)에서 /etc/profile에 등록해준다. 그리고 set 명령어를 통해 환경 변수 설정 정보를 조회할 수 있다.

/etc/profile 파일을 이렇게 수정해주면 된다. export는 환경 변수 지정을 의미하고 PATH를 기존의 PATH 경로와 더불어 JAVA, Tomcat 실행과 관련된 부분을 각각 추가해준다(bin 디렉토리가 실행과 관련있는 디렉토리이다.). 마지막으로 CLASSPATH에 Tomcat의 lib 디렉토리를 지정하는데 이 경로에 Connector가 다운로드되기 때문이다. 그러면 바로 MariaDB Connector를 다운로드 해준다.
MySQL :: Download MySQL Connector/J (Archived Versions)
MariaDB Connector인데 왜 MySQL페이지라고 한다면 사실상 같은 DB이기 때문이다. 자세한 건 검색해보길 추천한다.
※ source /etc/profile 명령어를 입력하면 수정한 설정 파일을 바로 적용해준다.

여기서 링크를 복사해서 'wget'으로 아무 디렉토리에 다운받아주고 'sudo apt install binutils' 패키지를 설치해준 다음 'ar -x mysql-connector-j_8.0.33-1ubuntu20.04_all.deb' 파일을 풀어주고 'tar xvzf data.tar.xz' 파일의 압축도 풀어주면 아래의 사진처럼 usr폴더가 생겼을텐데,

/usr/local/apache-tomcat-9.0.82/lib/usr/share/java/mysql-connector-j-8.0.33.jar 이 경로에 있는 mysql-connector-j-8.0.33.jar 파일을 /usr/local/apache-tomcat-9.0.82/lib 이 경로로 옮겨주고 그 외에 debian, control, data, deb, usr 파일과 디렉토리는 전부 제거해준다. 아래와 같이 남겨두면 된다.

source 명령어로 환경 설정 적용 및 Tomcat서버 재구동을 한다. 그리고 DB서버를 설치하기 위해 다른 가상머신 프로그램에 접속한다. 'sudo apt install mariadb-server'를 설치한다. 'sudo systemctl enable mariadb' 가상머신 부팅 시 시작 프로그램에 등록시킬 수도 있다.

설치 후 관리자 권한으로 root 계정으로 MariaDB 셸에 들어가서 여러 데이터베이스 작업을 할 수 있다.
create database test; #스키마 생성
create user 'test'@'%' identified by '1234'; #새로운 계정 생성
grant all privileges on *.* to test@'%'; #스키마에 대한 계정 권한 부여
flush privileges; #권한 변경 즉시 적용주석으로 남겨두긴 했지만, 데이터베이스는 공부가 필요하다. 관련 명령어나 동작 방식은 별도로 꼭 공부하길 권장한다. 내용이 방대하기 때문에, 여기선 간단하게 주석 설명으로 대체하고 넘어간다.
create table member(
id int,
name varchar(15),
password varchar(20)
);
insert into member(id, name, password)
values
(1, '일', 'abcd'),
(2, '이', 'bcde'),
(3, '삼', 'cdef'),
(4, '사', 'defg'),
(5, '오', 'efgh');그리고 간단하게 이런 데이터가 있다고 가정한다.
이제 정상적으로 데이터가 넘어오는지 확인하기 위해 Tomcat(WAS)서버에서 /usr/local/apache-tomcat-9.0.82/webapps 이 경로의 기존 ROOT 디렉토리의 이름을 ROOT.ori 등 자유롭게 바꿔주고 mkdir로 새로운 ROOT 디렉토리를 만들어준다. 그 다음 ROOT 디렉토리로 들어가 index.jsp 파일을 작성해주는데,
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.sql.*" %>
<!DOCTYPE html>
<%
String DB_URL = "jdbc:mysql://10.10.10.10:3306/test";
String DB_USER = "test";
String DB_PASSWORD = "1234";
String sql = "";
Connection conn = null;
PreparedStatement ptmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
sql = "select * from member where id = 1";
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
if (rs.next()){
out.println("Success "+rs.getString("name")+" "+rs.getString("password"));
}else {
out.println("실패");
}
}catch(Exception e){
out.println(e);
}finally{
conn.close();
ptmt.close();
rs.close();
}
%>첨부파일test.sql파일 다운로드연결이 되는지를 확인하는 것이 중요하기 때문에 이 정도로 작성해준다. 그리고 마지막으로 DB서버는 127.0.0.1로 로컬만 접속을 허용하고 있으니 /etc/mysql/mariadb.conf.d/50-server.cnf 이 경로의 파일로 들어가서 bind-address 부분을 모든 IP 허용인 0.0.0.0으로 바꿔준다.

그리고 sudo systemctl restart mysqld로 DB서버를 재시작하면

이렇게 바뀐 모습을 볼 수 있다. 이제 정말 마지막으로 모든 서버 구동된 상태에서 WEB서버 주소로 들어가보면,


이렇게 WAS서버와 연결이 잘 됐을 뿐만 아니라 DB서버의 데이터를 가져올 수 있다!!
Ⅲ. Hping3
대량의 패킷을 보내 서버를 다운시키는 목적을 가진 DDos 공격을 간단하게 체험해보고자 한다. 우선 'sudo apt install hping3'를 설치해준다. 설치가 되었으면 'sudo hping3 --icmp 10.10.10.7(3Tier 구축한 WEB서버 주소) --rand-source --flood'명령어를 실행시켜본다.

그러면 패킷을 보내고 있을텐데 이 패킷의 경우 특별한 접속 로그(log)에 남지 않기 때문에 tcpdump 명령어로 패킷 내역을 파일로 만들어 다운받아야 한다. WEB서버에서 'tcpdump -w test.pcap'명령어를 실행시켜주면 패킷 로그(log)를 파일로 저장할 수 있다.

저렇게만 명령어를 입력하면 계속 작성 중이기 때문에 작성을 별도로 종료해줘야 한다. WinSCP 프로그램으로 test.pcap 파일을 자신의 운영체제로 보내주고 Wireshark 프로그램으로 열어보면,

이렇게 무수히 많은 ping 공격 내역이 보일 것이다. 이건 말그대로 효과없는 DDos체험판이라고 생각하면 좋다.
※ tcpdump port 포트번호: tcpdump 명령어에 특정 포트로 들어오는 패킷만 저장하는 옵션도 있다.
Ⅳ. John
영국의 Jack the Ripper라는 연쇄 살인마의 이름을 딴 John the Ripper라는 크랙 Tool이 있다. 유닉스 운영체제의 비밀번호를 크랙하기 위해 개발되었으며, 간단한 암호는 바로 찾을 정도로 여러 암호 알고리즘이 들어가있다. 이 크랙용 암호 리스트 파일이 별도로 존재하는데,
john --wordlist=경로 및 파일명이 명령어를 통해 사용할 수 있다. 이미 웹에 돌아다니는 취약한 암호 리스트 파일을 다운로드 받아 john 크랙을 이 파일을 참고해서 실행하게 할 수 있는 것이다. 본격적으로 체험하기 위해 'sudo apt install john'을 설치한다. 테스트해보기 위해 'sudo adduser test1(계정명)' 명령어로 새로운 리눅스 계정(비밀번호는 'piglet'으로 간단하게 만들어준다.)을 만들어준다. 새로운 계정이 제대로 생성되었는지 /etc/passwd 파일을 확인해본다.

아무 디렉토리에서 john 디렉토리를 만든다. 기존의 passwd 파일은 해시 암호가 x로 대체되고 있기 때문에, 해시 암호가 저장되어 있는 /etc/shadow 파일을 unshadow해서 passwd 파일의 x부분을 해시 암호로 바꾼 뒤 새로운 파일로 만들어 저장할 필요가 있는데, 만들어 놓은 john 디렉토리에서 'sudo unshadow /etc/passwd /etc/shadow > ./passwd'명령어를 실행해서 변환된 리눅스 계정 암호 파일을 저장한다. 그렇게 저장한 passwd 파일을 열어보면,

이렇게 바뀐 상태로 저장된 모습을 볼 수 있다. 이제 본격적으로 크랙(무작위로 대입해서 계정의 암호를 찾아낸다.)을 작동시켜 암호를 찾게 하려면, 'john 찾을암호파일'로 실행하면 된다. 실제로 찾을 때까지 오래 걸리는 경우가 있기 때문에, 우리가 만들어 놓은 test1 계정을 대상으로만 암호를 찾게 한다. 'john --user=test1 ./passwd' 명령어를 입력하면 이렇게 진행(자동으로 진행된다.)하다 찾은 결과를 알려준다.

※ /etc/sudoers 파일이 있는데, 이 파일을 편집하면 일반 계정에 root(관리자) 권한을 줄 수 있다. 본래 이 파일을 수정하면 위험하기 때문에, 경고 메시지가 뜰테지만 무시해도 된다.

이렇게 수정하고 저장해준뒤 다시 로그인해보면 관리자 권한을 사용할 수 있다. 또, /etc/ssh/sshd_config 파일이 있는데 이 파일은 SSH 프로토콜로 접속 시 root 계정에 대해 SSH서버에서 로그인을 제한하거나 허용하는 설정을 할 수 있다. 즉, 바로 root 권한으로 로그인을 할 수 있게 하거나 막을 수 있다. 파일을 열면 아래와 같이 나오며,

주석처리 된 PermitRootLogin 속성을 변경해주면 된다.
※ Injection 개념이 있는데, 코드의 취약점을 악의적인 코드로 공격하는 기법이다. 간단하게 SQL Injection이 있는데, 만약 어떤 웹사이트가 로그인 시 데이터베이스에서 회원 테이블을 조회할 때,
select * from member where id = '' and pw = ''이렇게 확인하다고 하자. 이때 비밀번호를
aaa' or 'x' = 'x로 입력한다면 SQL Query는
select * from member where id = 'abc' and pw = 'aaa' or 'x' = 'x'로 작동하게 되고 'or'은 둘 중 하나만 참(True)이 되면 참이 되므로 로그인이 뚫리게 될 것이다. 이건 아주 기본적인 SQL Injection으로 다양한 Injection 공격이 있으며, 계정 수정 시 권한을 변경하거나 자바스크립트 코드를 삽입해 로그인이 안되게 하는 경우도 있다.
후기
드디어 이번 주 수업과 관련된 중요한 부분은 거의 다 정리한 것 같습니다. 사실 마지막 날(금요일)에 진행한 Docker 부분이 남아 있긴 한데, 아직 공부가 더 필요하고 나중에 계획된 클라우드 수업에서 진행할 수 있다고 생각?하기 때문에, 시간되면 포스팅 해보도록 하겠습니다. 나중에 배우게 되면 한 번에 포스팅하고 아니면 별도로 공부가 어느 정도 되었을 즘 포스팅하겠습니다.🖐️
Log in