DjangoWebアプリケーションがあり、Webアプリケーションとpostgresqlデータベースがあります2つの別個のUbuntuベースのマシンでホストされています。
(私のWebアプリケーションではなく)データベースマシンでSudo netstat -4plunt
を実行すると、次のような出力が得られます。
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *.*.*.*:16001 0.0.0.0:* LISTEN 831/python
tcp 0 0 127.0.0.1:29131 0.0.0.0:* LISTEN 46329/mdsd
tcp 0 0 0.0.0.0:1270 0.0.0.0:* LISTEN 1582/omiserver
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1160/sshd
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 55903/postgres
udp 0 0 0.0.0.0:51802 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:35637 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:36013 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:52523 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:36139 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:52618 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:36340 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:53408 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:53711 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:53774 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:53899 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:54031 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:54054 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:54275 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:54375 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:38157 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:38468 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:55391 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:39133 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:55708 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:39963 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:40181 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:56780 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:40441 0.0.0.0:* 63911/facebook
udp 0 0 0.0.0.0:56992 0.0.0.0:* 63911/facebook
Sudo strace -p 63911
を実行すると、次のようになります。
Process 63911 attached
[ Process PID=63911 runs in 32 bit mode. ]
select(17, [16], NULL, NULL, {15, 76647}) = 1 (in [16], left {14, 911022})
recv(16, "1", 4096, 0) = 1
select(17, [16], NULL, NULL, {20, 0}) = 1 (in [16], left {14, 953682})
recv(16, "1", 4096, 0) = 1
select(17, [16], NULL, NULL, {20, 0}) = 1 (in [16], left {14, 910776})
recv(16, "1", 4096, 0)
これはpostgresqlクエリのようにかすかに見えますが、正確にはわかりません。
ps -p 63911 -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
を実行すると、次のようになります。
PID MEMORY USER GROUP COMMAND ARGS
63911 3742124 postgres postgres facebook /tmp/facebook
そして/tmp/
には2つのファイルがあります。 1つはfacebook
(サイズ:1.3MB)と呼ばれる実行可能ファイルで、もう1つはgameover.so
(サイズ:8KB)と呼ばれます。
次に、chkrootkit
を自分のマシンで実行しました。肯定的な結果が1つありました:Searching for Suckit rootkit... Warning: /sbin/init INFECTED
。ただし、これはchkrootkit
で広く知られている誤検知です。確信が持てないので、システムを再構築します。
それでも、現在の脆弱性を特定し、それに応じて改善しない限りやりたくない。では、誰かが私にgameover.so
とは何か、そして将来これらの攻撃から保護するために私ができることを教えてくれますか?ファイアウォールが弱く(不要なポートをすべてブロックするにはどうすればよいですか)、まだ rkhunter (またはTripwireのようなもの)がインストールされていません。
ところで私はiptables-persistent
パッケージを使用しており、/ etc/iptables/rules.v4には以下が含まれています。
*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]
# Acceptable UDP traffic
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 5432 -i eth0 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
# Commit the changes
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
strings /tmp/gameover.so | less
を実行すると、次の結果が得られます。
__gmon_start__
_init
_fini
_ITM_deregisterTMCloneTable
_ITM_registerTMCloneTable
__cxa_finalize
_Jv_RegisterClasses
Pg_magic_func
text_ptr_to_char_ptr
malloc
chr_ptr_to_text_ptr
pg_finfo_sys_exec
pg_detoast_datum
system
pfree
pg_finfo_sys_eval
popen
realloc
strncpy
fgets
pclose
pg_finfo_sys_bineval
fork
sysconf
mmap
waitpid
pg_finfo_sys_fileread
fopen
fseek
ftell
fclose
fread
libc.so.6
_edata
__bss_start
_end
GLIBC_2.2.5
fffff.
[]A\
AUATUH
H;] t
Y[]A\D
AWAVAUATUSAQH
<(Ic
[]A\A]A^A_
ATUSH
[]A\
AUATUSH
[]A\A]A^
0123456789ABCDEF
;*3$"
GCC: (Debian 4.7.2-5) 4.7.2
.shstrtab
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.jcr
.dynamic
.got
.got.plt
.data
.bss
.comment
strings /tmp/facebook | less
を実行すると、理解できない用語が生成されます。
PTRhP
QVh0
[^_]
<;t 9u
,[^_]
,[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
\[^_]
[^_]
WVS1
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
P[^]
[^_]
XXXX
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
0[^]
amp.
[^_]
[^_]
[^_]
[^_]
[^_]
[^_]
ffffff.
9Qhu
9Qhu
ffff.
fff.
B`@c
Bd@c
[^_]
,[^_]
[^_]
[^_]
[^_]
CdHc
[^_]
SQLインジェクションの被害者のようです。十分なsanitizing入力なしにWebからデータを受け取り、データベースにクエリを実行するスクリプト(おそらくPHP)があります。
kill 63911
を始める前に、ps ho lstart 63911
をご覧ください。
これにより、プロセス63911が実行される直前に何が起こったかをWebサーバーログで検索できます。
/tmp/facebook
とは??
A)strace -p 63911
で、これが何をするのかを知ることができます...
B)tcpdump -ani eth0 udp port 51802
でランダムに接続を追跡できます。
C)less /tmp/facebook
、またはバイナリファイルの場合はstrings /tmp/facebook | less
(もちろん/tmp/gameover.so
でも)を使用できます。
/sbin/init
はどうですか?
同じディストリビューションの同じバージョンで別のホストを構築し、サイズと日付(ls -l
を使用)とsha1sum /sbin/init
を比較します。
また、システムを最新の状態に保ちます。そしてバックアップがあるs !!
注:システムが強く(かつ効率的に)感染している場合は、checksums
、string
またはls
を実行する前に、システムをシャットダウンする必要があります。しかし、netstat
は何も隠すことなく機能しているようなので、そうではないようです...
だから誰も私に何が起こったかの前兆を与えることができます
ハッキングされました。しかし、それは何でもかまいません(SQLインジェクション、リモートファイルのインクルード、Shellshock ...)。システムをよく見ないと分からないでしょう。そして、それでも、攻撃者がシステムがどのように攻撃されたのかすべての痕跡を削除した可能性があるため、それを特定することは不可能かもしれません。
ところで、iptables-persistentパッケージを使用しています...
Iptablesなどのパケットフィルターファイアウォールは、SQLインジェクションなどのアプリケーションレベルの攻撃からユーザーを保護することができません。
1つはfacebookと呼ばれる実行可能ファイルで、もう1つはgameover.so(動的にリンクされたライブラリ?)と呼ばれます。
ファイルの名前はそれほど重要ではなく、コードが重要です。
...そしてこれを防ぐために私ができることは?
ハッキングされた経緯をご覧ください。問題を修正します。サーバーを再構築します。サーバーをバックアップから復元しないでください。同じ攻撃で再びハッキングされる可能性があります。
それができない場合は、ご自身で専門家のサポートを受けてください。
この回答では、特に次のことを扱います。
将来これらの攻撃から保護するために私ができること
実際の元の感染ベクトルを特定することは非常に困難であり、複数の脆弱性がある場合-おそらく-それ自体では不十分です。システムセット全体の一般的な強化から始めて、ログ記録(IDS/IPS)を追加します。これらは、感染が発生したときにそれらを検出し、試行中に感染をブロックすることができます。
本当に改善するには、双方向をブロックし、IDS/IPSの実行を開始します。これらのログを確認することを忘れないでください。これは、次の感染ベクトルを特定するのに役立ちます。
次のことをお勧めします。
マシンに加えて、ファイアウォールをインターネットから取り外します。
新規購入
または、ハードリセットを実行し、別のネットワークで妥協のないマシンを使用して、ファームウェアのアップデートをダウンロードします。古くてない場合は「新しいものを購入する」をご覧ください
彼らがLAN内のコンピューターを使用できた場合、ファイアウォールへのログインを試行または成功することができました。
ファイアウォールに oneofmanyvulnerabilities ;があるかどうかも確認してください。その場合は、「新しいものを購入する」を参照してください
pfSenseフリーソフトウェア を2枚のNICが搭載された古いマシン、または独自のデバイスで実行する、または fitlet 小さなファンレスPCなど、本格的なハードウェアルーター/ファイアウォールを購入します。
次に、SnortまたはSuricataパッケージをインストールします。これらはIDS/IPSパッケージであり、進行中の攻撃に気づく可能性があり、オプションで一定期間IPをブロックします-あなたの場合、数日間ブロックしてログを監視します非常に注意深く、彼らが戻ってきてみてください。
そして、Snort VRTルールのサブスクリプションを購入します。 ET Proのルールも検討してください。
すべてをブロックします。最初は大規模なブロッキングが発生します。 IP *ルールごとにホワイトリストを作成し、それらが元に戻ろうとするのを観察します。
または、少なくとも biquiti Edgerouter Lite -非常に安価ですが、GUIでは非常に制限されています(本当に高度なものはすべてコマンドラインにあり、IDS/IPSを実行するためのものではありません)。
そして、受信と送信のすべてをブロックするように設定します。必要に応じて、個々のIPまたは小さなサブネット/ブロックの個々の送信ポートを開きます(たとえば、OSの更新用)。
これは非常に煩わしいでしょう-そのルートに行く場合はpfSenseでエイリアスを利用してください
これにより、ファイアウォールの内側にあるすべてのサーバーがコマンドアンドコントロールサーバーにアクセスする能力も大幅に制限されます。
可能であれば、Webサーバーとデータベースサーバーをまったく異なるVLANまたはファイアウォールポートに配置して、暗号化を有効にした一方向のデータベース接続を介してのみ相互に通信できるようにします。
すべてのソフトウェアを完全に最新の状態に保ち、そこに保管する
ミックス内のすべてのソフトウェアの強化ガイドを探します。
ファイアウォール、サーバー、データベース、ルーターなどのすべてのパスワードを変更します。
KeePass のようなものを使用して、サービスごとに長いランダムなものを生成します。
データベースの設定、セキュリティに移動し、「1秒の遅延」リンクまたはボタンをクリックしてから、それを増やすことを忘れないでください。KeePassを開くのに3、4、7秒かかるので、攻撃者が働かなくてはなりません。デフォルトより信じられないほどはるかに難しい。
次の場合は、マシンをオフにしてください。
新しいハードドライブを購入する
電源に接続しますが、ネットワークには接続しません(特にWifiは接続しません。すべてのWi-Fiを物理的に取り外し/オフにします)
最初から新しいOSをインストールする
ソフトウェアとOS /アプリレベルのセキュリティを設定し、パッチを適用します。
侵害されたマシンのドライブがソリッドステートの場合は、それらを分解してチップを割るか、またはトーチをそれらが溶けるまで当てます。
侵害されたマシンのドライブに回転プラッターが付いている場合は、ハンマー、ガロンジップロックバッグの箱、小さなキッチンタオルを購入します。
侵害されたハードドライブを小さなキッチンタオルで包みます
ラップしたHDを少なくとも6つのZiplockバッグに入れ、それぞれを密封します
ガラスの破片がタオルから漏れるまで、ハンマーでドライブを粉砕しますOR(金属の大皿がある場合)それにかなりのへこみがあります)。
既存のバックアップから貴重なデータを復元します
または、侵害されたHDを交換しない場合は、はるかにリスクが高くなります。 [〜#〜] dban [〜#〜] または同様のもので拭いてやり直してください。
同じネットワーク上にWindowsマシンがある場合は、いくつかのオフラインウイルススキャンを実行します。
1つの製品がすべてをカバーするわけではないため、いくつかを使用しますが、複数の異なる製品を使用することで、カバーされていないスペースを大幅に削減できます。私はお勧めします:
AVGおよびAvira(または両方))の少なくとも1つ
dr. WebとKaperskyの少なくとも一方(できれば両方)、ロシアの関与を得る。
Comodo Rescue Disk(ルートキットスキャンも宣伝します)
お気に入りの別のカップルを選びます。
本当に心配な場合は、ネットワーク上のすべてのマシンでこれを行ってください。
彼らはほぼ間違いなく追跡Cookieを見つけるでしょう-それは正常であり、心配する必要はありませんが、私は常にそれらを削除します。
このすべての後、再び完全にオンラインになったら
OSにパッチが適用されており、パッチが適用されていることを確認してください。
Snort/Suricataログを定期的に読み取り、設定を調整します。
pfSenseとEdgerouter Liteはどちらも、さまざまなタイプのVPNをセットアップできます。 Webサーバー以外の受信アクセスには、証明書ベースの証明書を使用します。
(新しい)ファイアウォールにパッチが適用され、最新であることを確認します。
他のすべてのソフトウェアにパッチが適用され、最新であることを確認します。
永遠に。
システムがハッキングされ、サーバーがボットネットで使用されているようです。いつ発生したかがわかっていて、詳細なログファイルがある場合は、ログを分析して、侵害の兆候があるかどうかを確認できます。
ほとんどのシステムは、パッチが利用可能な既知の脆弱性、または攻撃者がシステムをクラックできる不正なコードを攻撃することでハッキングされます。解決策は、OSとアプリケーションのパッチ適用に追いつき、システムとアプリケーションを強化し、ギャップを埋めるためにアプリケーションのコード分析を行うことです。
あなたは試すことができます Snort :は強力なネットワーク侵入検知(IDS)ツールです
Snortのオープンソースネットワークベースの侵入検知システム(NIDS)は、インターネットプロトコル(IP)ネットワーク上でリアルタイムのトラフィック分析とパケットロギングを実行する機能を備えています。 Snortはプロトコル分析、コンテンツ検索、マッチングを実行します。これらの基本的なサービスには、アプリケーションに対応するトリガーされたサービス品質を含め、レイテンシの影響を受けやすいアプリケーションが使用されているときにバルクトラフィックの優先順位を下げるなど、多くの目的があります。