내 동료가 얼마 전 나에게 기업 보안 서버의 근본 원인 분석을 수행하도록 지시했습니다. 우리는 문제가 루트로 실행되는 프로세스 중 하나에 있다는 것을 알고 있지만 어떤 프로세스인지는 모릅니다.
나는 먼저 다음 명령을 실행하여 연구를 시작했습니다.
ps -aux | grep -v grep | grep root
그러면 수십 개의 프로세스 목록이 반환됩니다. 그런 다음 동료가 다음 명령을 사용하여 검색을 구체화하는 데 도움을 주었습니다.
ps -aux | grep -v grep | grep root | grep -Ev '[[]'| grep -v tty
이 새로운 명령은 반환된 프로세스 목록을 크게 줄여 문제를 빠르게 발견했습니다. 명령의 마지막 두 부분이 필터링됩니다.
1) [ksoftirqd/0]과 같이 [ ]로 둘러싸인 프로세스 2) 텔레타이프 터미널을 통해 실행되는 프로세스
ps(1)은 찾을 수 없는 인수가 있는 프로세스가 대괄호 안에 배치되며(무슨 의미인지는 확실하지 않음) tty가 현대 bash 터미널의 전조일 뿐이라고 알려줍니다. 그러나 나는 여전히 그 중요성(또는 사소하다고 말해야 하는가)과 더 "생산적인" 루트 프로세스에서 이를 제거할 수 있는 이유를 이해하지 못합니다.
누군가 여기서 뭔가를 명확히 할 수 있습니까?
감사해요
답변1
"찾을 수 없는 매개변수"는 일반적으로 절차가가지다일반 사용자 프로세스가 아니고 커널에 의해 직접 시작되는 프로세스이기 때문에 명령줄 매개변수가 없습니다. 오류가 발생하는 프로세스를 찾는 경우 일반적으로 이러한 커널 프로세스 중 하나가 아니므로 동료가 이를 필터링할 것을 제안했습니다.
척추경은아니요"현대 bash 터미널의 선구자일 뿐입니다." bash나 shell과는 전혀 관련이 없으며 어떤 것의 전신도 아닙니다. 나열된 tty는 ps
프로세스의 제어 터미널입니다(있는 경우). tty를 제어하는 프로세스는 대화형 세션의 일부로 일부 사용자에 의해 시작되었을 가능성이 높습니다(로컬 콘솔, 로컬 직렬 포트, SSH 세션, 화면 등에서 시작된 세션이든 관계없이). 중요하지 않습니다. 터미널입니다. tty를 제어하지 않는 프로세스는 일반적으로 데몬과 시스템 서비스입니다. 동료는 데몬이나 시스템 서비스에서 문제가 발생할 가능성이 더 높다고 제안합니다.
명령줄의 나머지 부분은 다음과 같습니다.
ps -aux | grep root
어떤 OS를 사용하고 있는지는 모르겠지만 -style 매개변수가 ps
있는 버전은 aux
일반적으로 BSD 레거시입니다. 저는 BSD에 익숙하지 않지만 ps
모든 프로세스를 나열한 다음 루트가 소유하지 않은 모든 프로세스를 필터링하는 대신 특정 사용자에게 속한 프로세스만 나열하는 옵션이 있다고 생각합니다. 예를 들어 Linux를 사용하는 경우 다음과 같습니다.
ps -fu root
답변2
솔직히 말해서 좀 어리석은 것 같습니다.
grep -Ev "[[]"
명령에서 여는 괄호가 있는 프로세스를 제외합니다. 이는 일반적으로 커널 프로세스이지만 일반 사용자 공간 프로그램도 명령줄에 이 문자를 표시할 수 있습니다.
grep -Ev "tty"
하늘색도 마찬가지다. 출력 라인 어딘가에 "tty" 문자열이 있는 프로세스는 제외됩니다 ps
. 여기에는 터미널 장치를 여는 프로세스(의사 터미널(!)을 여는 프로세스는 아님)이 포함되므로 출력을 데몬 작업으로 제한하는 것처럼 들립니다.
ps
그러나 위의 경우와 마찬가지로 다음과 같이 출력에 나타나는 프로세스 도 제외됩니다 .
pid ? R+ 310:03 /home/pwned_user/bin/rootkit_tty[_rofl crack root-password
즉, 무엇이든 발견하면 행운이지만 모든 것을 찾았다고 확신할 수는 없습니다. 귀하의 질문에 처음에 "엔터프라이즈 보안 서버"가 있다는 점을 고려하면 이 서버는 다른 수준으로 올라갑니다(원할 경우 아래로 내려갑니다).
답변3
일반적으로 말해서, 당신은 그것을 하고 싶지 않습니다 ps aux | grep -v grep
. 그것이 목적입니다 pgrep
:
pgrep -u root
위 명령은 에 의해 시작된 모든 프로세스를 나열합니다 root
. ps
1) 이름이 에 포함된 사용자를 제외하고 2) ttys에 나열되지 않은 실행 중인 사용자를 제한하려면 []
그렇게 해야 합니다. grep -v
일치하는 줄을 삭제하는 대신 각 문자열이 일치하지 않아야 하는 정확한 위치를 지정하여 다른 답변에서 언급된 문제 중 일부를 피할 수 있습니다.어딘가에):
ps aux | awk '$1=="root" && $7 !~/^tty[0-9]$/ && $NF!~/^\[.*\]$/'
---------- ---------------- ---------------
| | |
| | |-> If the last field
| | is within [ ]
| |---------------> If the 7th field starts
| with tty and ends in a digit
|----------------------------> If the 1st field is 'root'