복습)
require : 성공해야만 전체 인증 성공.
실패시 다음 인증을 수행하지만, 인증자체는 실패
sufficient : 모듈이 성공하면 인증은 성공. 실패는 인증에 영향X
requisite : 실패시 즉시 실패.
lsof : 열린 파일에 대한 정보 출력
+ 쉘 스크립트에 대한 강의를 할 것인지 (시간이 오래 걸림) 고민중이라 하심
파이프 PIPE
프로세스간 통신 방법인 IPC 방법 중 하나
기호 이름은 언네임드 파이프 |
0 표준입력, 1 표준출력, 2 표준에러를 의미한다.
man 명령어
man 명령어를 통해 설명을 참고할 때, man 페이지는 여러 챕터로 나누어져 있는데
exit나 wait같은 명령어는 여러 챕터에 내용이 있다
때문에 명령어로서의 설명을 보려면 man 3 exit, man 3 wait 이렇게 페이지를 명시해야 한다
exec 명령어
=> exec 현재쉘에서 명령어 수행. 쉘의 마지막 명령어가 수행되면 종료exit되기 때문에 수행후 바로 꺼진다.
그래서 fork()를 통해 복제한 후 복제된 쉘에서 수행해야 한다
( 부모 프로세스는 복제된 자식 프로세스의 실행종료를 wait 기다리고 있다 )
exit(0)
정상종료, 0외의 값은 비정상종료
( 예를 들어 int main() { return 0; } 같은 것 )
모든 명령어에는 리턴값이 있는데
grep이 (패턴)검색에 성공하면 0을 리턴하고, 찾지 못하면 1을 리턴한다.
공격코드 업데이트 사이트 참고 : https://www.exploit-db.com/
pwd | grep -q textStr
return_value=$?
if [ $return_value -eq 1 ]; then
echo "들어있음"
else
echo "들어있지 않음"
fi
// $?에는 방금 전 실행한 명령어의 리턴값을 담아준다.
// grep 경우 내용을 찾으면 0, 찾지 못하면 1을 리턴한다.
=> pwd 폴더명에 textStr이 포함되어 있는지 체크
절대경로 : 사용시 경로만 수정하면 된다. 단점은 경로가 너무 김.
상대경로 : 기본경로는 /lib64/security로 설정됨. 파일 디버깅시 직접 컴파일하고 복사하거나 복구해야하는 번거로움이 있다.
실습 ) pam_succedif.so
/rpmbuild/SOURCES/Linux-PAM-1.1.8/modules/pam_succeed_if
참고 : https://linuxmaster.net/pam/linux-pam/sag-pam_succeed_if.html
계정 속성 검사
계정의 속성이나, 다른 PAM 항목 값에 따라 인증의 성공, 실패 여부를 결정할 수 있다
=> 기존 설정 : 인증자 uid가 0(root)이면 성공. 시스템로그에 기록X
+ ~ pam_succeed_if.so uid = 1000
=> uid 1000번으로 바꾸려고 할 때를 의미
~ pam_succeed_if.so uid = 1000 use_uid
=> uid 1000번 사용자가 su를 사용할 때를 의미
=> linuxadmin에서 su 실행시 암호를 묻지 않는다
똑같이 일반유저인 user1이 su 시도시 암호를 묻는다
=> uid 1000번 사용자로 변경하고자 했을 때 암호를 묻지 않게 되었음
PAM 모듈 분석 방법
1. man 명령어로 모듈 설명서 참고
2. 분석하고자 하는 모듈 디렉터리로 이동하여 소스코드 확인/디버깅 ( 함수에 커서를 놓고 Shift + k 하면 man 에 있을시 설명 확인 가능 )
3. /etc/pam.d/명령어 파일을 수정하여 디버깅 결과를 확인하면서 분석
rpm -Va (전체 패키지)
=> 체크썸checksum 검사 명령어
rpm -Vp (한 패키지만 검사)
쉘 스크립트의 if문 형태
1) if 조건
then 실행문
else 실행문
fi
2) if test 조건(참/거짓)
then 실행문
else 실행문
fi
3) if [[ 조건 ]] 혹은 if [ 조건 ]
then 실행문
else 실행문
fi
ex) 변수활용하여 문자열 패턴 매칭 ( 문자열 비교식을 사용하려면 대괄호 두 개로 감싸주어야 함 )
if [[ $textStr == *text* ]] ← 와일드카드* 사용
if [[ $textStr == *text* && $textStr2 = "$match" ]]
if [[ $textStr =~ text ]] 또는 if [[ "$textStr" =~ text ]] ← 정규표현식 연산자 =~ 사용
ex) 산술연산 (( ))
if [ $textNum -gt 7 ] 또는 [ $((textNum > 7)) -ne 0 ]
( 참고 블로그 : https://shlee1990.tistory.com/607 , https://young-cow.tistory.com/81 )
+ test와 [ ] 대괄호는 중복 사용될 수 없다
+ 비교식
-z 값이 공백이면 참
-n 값이 공백이 아니면 참
-eq 값1=값2 이면 참
-ne 값1!=값2 이면 참
-ge 값1이 값2보다 크거나 같으면 참
-gt 값1이 값2보다 크면 참
-le 값1이 값2보다 작거나 같으면 참
-lt 값1이 값2보다 작으면 참
-a = 둘다 참이면 참
-o = 둘 중 하나라도 참이면 참
파일확인
-f 일반파일
-d 디렉토리
-L 심볼릭링크
-S 소켓파일
-r 권한이 r이면 참
-w 권한이 w이면 참
-x 권한이 x면 참
-s 파일크기가 0이 아니면 참
-nt 파일1이 파일2보다 최신일때 참
-ot 파일1이 파일2보다 오래되면 참
-ef 파일1과 파일2가 같은 파일이면 참
( awk 라는 명령어도 있다고 해서 참고용으로 달아줌 : https://gsk121.tistory.com/438 )
이번주의 과제
1. C언어의 문법 중 배열, 포인터, 구조체에 대해서 공부해오기
- 1차원 배열, 2차원 배열
- 1차원 포인터, 2차원 포인터
- 구조체 포인터
2. /etc/passwd, /etc/shadow의 구조체 알아보기
- 해당 구조체들의 정보를 출력하는 함수를 이용해 출력 프로그램 작성 (쉘이든, c언어든)