답변:
이러한 종류의 작업에 감사 된 프레임 워크를 사용할 수 있습니다. 그들은 "사용자 친화적"이거나 직관적이지 않기 때문에 약간의 파고가 필요합니다.
먼저 감사 설치, 실행 및 커널이 지원하는지 확인하십시오.
우분투의 apt-get install auditd
경우 예를 들어 설치할 수 있습니다 .
그런 다음 감사에 대한 정책을 추가하여 다음 connect
과 같이 모든 syscall 을 모니터링 하십시오.
auditctl -a exit,always -F arch=b64 -S connect -k MYCONNECT
Linux의 32 비트 설치를 사용하는 경우 b64를 b32로 변경해야합니다.
이 명령은 감사 프레임 워크에 정책을 삽입하고 이제 connect () syscall이 감사 로그 파일 (보통 /var/log/audit/audit.log
)에 기록됩니다 .
예를 들어, netcat을 news.ycombinator.com 포트 80에 연결하면 다음과 같은 결과가 발생합니다.
type=SYSCALL msg=audit(1326872512.453:12752): arch=c000003e syscall=42 success=no exit=-115 a0=3 a1=24e8fa0 a2=10 a3=7fff07a44cd0 items=0 ppid=5675 pid=7270 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts4 ses=4294967295 comm="nc" exe="/bin/nc.openbsd" key="MYCONNECT"
type=SOCKADDR msg=audit(1326872512.453:12752): saddr=02000050AE84E16A0000000000000000
여기에서 /bin/nc.openbsd 응용 프로그램이 connect () 호출을 시작했음을 알 수 있습니다. 많은 연결 호출을 받고 특정 IP 또는 포트만 grep하려는 경우 약간의 변환을 수행해야합니다. SOCKADDR 행에는 saddr 인수가 포함되며 0200으로 시작하고 16을 나타내는 16 진수 (0050)의 포트 번호 (80)를 의미하고 16 진수의 IP (AE84E16A)는 news.ycombinator.com의 IP 174.132.225.106입니다.
감사 프레임 워크는 많은 로그를 생성 할 수 있으므로 미션을 완료하면 비활성화해야합니다. 위의 정책을 비활성화하려면 다음과 같이 -a를 -d로 바꾸십시오.
auditctl -d exit,always -F arch=b64 -S connect -k MYCONNECT
감사 된 프레임 워크에 대한 유용한 문서 :
http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html
http://www.kloth.net/services/iplocate.php 에서 IP 주소를 16 진수, 12 월, 바이너리 등으로 변환합니다.
일반 16 진 / dec 변환기 :
http://www.statman.info/conversions/hexadecimal.html
IT 보안 스택 교환에서 감사에 대한 간략한 소개. http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/
편집 1 :
또 다른 빠른 '더러운 (스웨덴어 : fulhack) 방법은 다음과 같이 연결 데이터를 덤프하는 빠른 루프를 만드는 것입니다.
while true;do
ss -ntap -o state established '( dport = :80 )'
sleep 1
done
이 명령은 ss
명령 (소켓 통계)을 사용하여 시작된 프로세스를 포함하여 현재 설정된 연결을 포트 80에 덤프합니다. 많은 데이터가 있으면 | tee /tmp/output
화면에 출력을 표시하고 나중에 처리 / 파기 할 수 있도록 / tmp / output에 기록하기 위해 추가 한 후에 추가 할 수 있습니다 . 빠른 haproxy 연결을 찾지 못하면 제거를 시도 sleep 1
하지만 사용량 이 많은 시스템 인 경우 광범위한 로깅에주의하십시오. 필요에 따라 수정하십시오!
ausearch -i
하는 데 사용할 수도 있습니다 saddr
.
인터넷에서 다른 호스트에 성공적으로 연결된 소켓 만 보려면 "ausearch -i"에서 얻은 거대한 로그를 가져와도됩니다. 필자는 인터넷에서 호스트에 연결하기 위해 소켓을 생성 한 각 프로세스와 명령을 해당 대상 호스트의 연결 주소와 소켓이 "생성 된"현재 시간으로 가져 오는 간단한 스크립트를 작성했습니다. 여기있어:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "You must run this script as root boy!"
exit 1
fi
> proccessConnections.dat
connections=`ausearch -i | grep host: | awk -F "msg=audit" '{print $2}' | awk -F ": saddr" '{print $1}'`
connectionsNumber=`echo "$connections" | wc -l`
echo "Number of connections: $connectionsNumber"
echo "$connections" > conTemp.dat
let counter=1
while read connectInfo; do
success=`ausearch -i | grep "$connectInfo" | grep "type=SYSCALL" | grep success=yes`
addressInfo=`ausearch -i | grep "$connectInfo" | grep type=SOCKADDR | awk -F ': ' '{print $2}'`
processInfo=`ausearch -i | grep "$connectInfo" | grep "type=SYSCALL" | awk -F 'comm=' '{print $2}' | awk -F 'key' '{print $1}'`
if [[ $success != "" ]]
then
echo "[$counter - $connectionsNumber] (success) comm=$processInfo - $addressInfo - $connectInfo"
echo "[$counter - $connectionsNumber] (success) comm=$processInfo - $addressInfo - $connectInfo" >> proccessConnections.dat
else
echo "[$counter - $connectionsNumber] (no success) comm=$processInfo - $addressInfo - $connectInfo"
echo "[$counter - $connectionsNumber] (no success) comm=$processInfo - $addressInfo - $connectInfo" >> proccessConnections.dat
fi
let counter++
done < conTemp.dat