secbeg’s log

作業メモです

fluentd-elasticsearch-kibanaでtwitter収集

0.はじめに

fluentd-elasticsearch-kibanaでtwitterデータ収集してみました。

  • CentOS release 7.4.1708
  • elasticsearch 5.6.4
  • kiban 5.6.4
  • fluentd td-agent 0.14.23

1.環境構築

  • elasticsearch 下記リンクを参考にしてください。

secbeg.hatenablog.com

  • kibana

elasticsearchをインストールした際に追加したリポジトリを使用してインストールする。

# yum install kibana

ローカル以外からアクセスするために、下記に修正する。

# vi /etc/kibana/kibana.yml


server.host: 0.0.0.0 

kibanaを起動する。

# systemctl start kibana
# systemctl enable kibana

ブラウザから http://[IPアドレス]:5601 にアクセスすると下記にような画面が表示される。

f:id:secbeg:20171118103547p:plain

  • fluentd

前提となるソフトをインストールする。

# yum -y install gcc gcc-c++ openssl-devel libcurl libcurl-devel

fluentdはrubyで動作するため、rubyをインストールする。

# yum install https://github.com/feedforce/ruby-rpm/releases/download/2.2.4/ruby-2.2.4-1.el7.centos.x86_64.rpm

fluentdをインストールする。

# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

twitter,elasticsearchプラグインをインストールする。

# td-agent-gem install eventmachine
# td-agent-gem install fluent-plugin-twitter
# td-agent-gem install fluent-plugin-elasticsearch

twitter収集するための設定に変更する。 今回は、「ransomware」のキーワードがあるtweetを収集する。

# vi /etc/td-agent/td-agent.conf

<source>
  @type twitter
  consumer_key          xxx
  consumer_secret       xxx
  access_token          xxx
  access_token_secret   xxx
  tag                 input.twitter
  timeline            tracking                
  keyword             'ransomware'
  lang                ja,en                    
  output_format       nest                    
  flatten_separator   _                        
</source>

<match input.twitter>
    type elasticsearch
    include_tag_key true
    tag_key @log_name
    host 127.0.0.1
    port 9200
    logstash_format true
    logstash_prefix twitter
    flush_interval 10s
</match>

下記のtwitterAPIを使用するための値は、 https://apps.twitter.com/ から取得する。
注)使用するtwitterアカウントに電話番号を登録しておく必要があります。

consumer_key [xxx]
consumer_secret [xxx]
access_token [xxx]
access_token_secret [xxx]

起動

# systemctl start td-agent
# systemctl enable td-agent

2.収集確認

とりあえず、収集はできていそう。 f:id:secbeg:20171118105613p:plain

ハッシュタグのランキングを円グラフで表示してみる。 f:id:secbeg:20171118105638p:plain

3.その他

  • 注意
    サーバの時刻がずれているとうまく収集できないので、下記等であわせておく。
ntpdate ntp.nict.jp
  • index確認
# curl -XGET http://192.168.0.10:9200/_aliases?pretty
  • index削除
curl -XDELETE 'http://localhost:9200/[index_name]

4.参考

docs.fluentd.org

github.com

pocketstudio.jp

CentOS7にelasticsearch5をインストール

0.はじめに

CentOS7にelasticsearch5をインストールしてみました。

  • CentOS7
  • elasticsearch5

1.インストール

まずは、elasticsearchを動かすためにjava8をインストールする。

# yum install java-1.8.0-openjdk.x86_64

次に、yumでelasticsearchをインストール可能とするためにyumリポジトリを追加する。

# vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

そして、elasticsearchをインストールする。

# yum install elasticsearch

設定ファイルを変更し、遠隔でアクセス可能にする。

# vi /etc/elasticsearch/elasticsearch.yml
network.host: 0.0.0.0

2.起動確認

下記の通り起動する。

# systemctl start elasticsearch
# systemctl enable elasticsearch
# systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2017-11-14 22:54:50 JST; 6s ago
     Docs: http://www.elastic.co
  Process: 1346 ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec (code=exited, status=0/SUCCESS)
 Main PID: 1348 (java)
   CGroup: /system.slice/elasticsearch.service
           └─1348 /bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server ...

11月 14 22:54:50 localhost.localdomain systemd[1]: Starting Elasticsearch...
11月 14 22:54:50 localhost.localdomain systemd[1]: Started Elasticsearch.

下記にアクセスすると、
http://[サーバのipアドレス]:9200/

elasticsearchはrest-IFで通信するので、このような画面が表示される。

{
  "name" : "y4dQbBJ",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "-XVjcXvkR66DrDwb6prSNA",
  "version" : {
    "number" : "5.6.4",
    "build_hash" : "8bbedf5",
    "build_date" : "2017-10-31T18:55:38.105Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}

注意)CentOS7のfirewallを設定変更し、9200ポートを開ける必要がある。

3.その他

CentoOS6にインストールできなかった話。

yumでインストールした後、起動するも、すぐに停止、、、

# service elasticsearch start
elasticsearch を起動中:                                    [  OK  ]
# service elasticsearch status
elasticsearch は停止していますがサブシステムがロックされています

ログを見てみると、

[root@localhost ~]# cat /var/log/elasticsearch/elasticsearch.log
[2017-11-14T08:03:35,000][WARN ][o.e.b.JNANatives         ] unable to install syscall filter:
java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
    at org.elasticsearch.bootstrap.SystemCallFilter.linuxImpl(SystemCallFilter.java:342) ~[elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.SystemCallFilter.init(SystemCallFilter.java:617) ~[elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.JNANatives.tryInstallSystemCallFilter(JNANatives.java:258) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.Natives.tryInstallSystemCallFilter(Natives.java:113) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:111) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:195) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) [elasticsearch-5.6.4.jar:5.6.4]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) [elasticsearch-5.6.4.jar:5.6.4]
[2017-11-14T08:03:35,714][INFO ][o.e.n.Node               ] [] initializing ...
[2017-11-14T08:03:36,114][INFO ][o.e.e.NodeEnvironment    ] [H9z2zQY] using [1] data paths, mounts [[/ (/dev/mapper/VolGroup-lv_root)]], net usable_space [40.8gb], net total_space [44.7gb], spins? [possibly], types [ext4]
[2017-11-14T08:03:36,114][INFO ][o.e.e.NodeEnvironment    ] [H9z2zQY] heap size [1.9gb], compressed ordinary object pointers [true]
[2017-11-14T08:03:36,116][INFO ][o.e.n.Node               ] node name [H9z2zQY] derived from node ID [H9z2zQYvSSy6HdF8qFZGHw]; set [node.name] to override
[2017-11-14T08:03:36,116][INFO ][o.e.n.Node               ] version[5.6.4], pid[1383], build[8bbedf5/2017-10-31T18:55:38.105Z], OS[Linux/2.6.32-696.13.2.el6.x86_64/amd64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/1.8.0_151/25.151-b12]
[2017-11-14T08:03:36,117][INFO ][o.e.n.Node               ] JVM arguments [-Xms2g, -Xmx2g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -Djdk.io.permissionsUseCanonicalPath=true, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Dlog4j.skipJansi=true, -XX:+HeapDumpOnOutOfMemoryError, -Des.path.home=/usr/share/elasticsearch]
[2017-11-14T08:03:39,124][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [aggs-matrix-stats]
[2017-11-14T08:03:39,124][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [ingest-common]
[2017-11-14T08:03:39,124][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [lang-expression]
[2017-11-14T08:03:39,124][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [lang-groovy]
[2017-11-14T08:03:39,124][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [lang-mustache]
[2017-11-14T08:03:39,124][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [lang-painless]
[2017-11-14T08:03:39,125][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [parent-join]
[2017-11-14T08:03:39,125][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [percolator]
[2017-11-14T08:03:39,126][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [reindex]
[2017-11-14T08:03:39,126][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [transport-netty3]
[2017-11-14T08:03:39,126][INFO ][o.e.p.PluginsService     ] [H9z2zQY] loaded module [transport-netty4]
[2017-11-14T08:03:39,127][INFO ][o.e.p.PluginsService     ] [H9z2zQY] no plugins loaded
[2017-11-14T08:03:42,954][INFO ][o.e.d.DiscoveryModule    ] [H9z2zQY] using discovery type [zen]
[2017-11-14T08:03:43,865][INFO ][o.e.n.Node               ] initialized
[2017-11-14T08:03:43,865][INFO ][o.e.n.Node               ] [H9z2zQY] starting ...
[2017-11-14T08:03:44,247][INFO ][o.e.t.TransportService   ] [H9z2zQY] publish_address {10.60.251.19:9300}, bound_addresses {[::]:9300}
[2017-11-14T08:03:44,267][INFO ][o.e.b.BootstrapChecks    ] [H9z2zQY] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[2017-11-14T08:03:44,274][ERROR][o.e.b.Bootstrap          ] [H9z2zQY] node validation exception
[2] bootstrap checks failed
[1]: max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]
[2]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
[2017-11-14T08:03:44,289][INFO ][o.e.n.Node               ] [H9z2zQY] stopping ...
[2017-11-14T08:03:44,339][INFO ][o.e.n.Node               ] [H9z2zQY] stopped
[2017-11-14T08:03:44,339][INFO ][o.e.n.Node               ] [H9z2zQY] closing ...
[2017-11-14T08:03:44,361][INFO ][o.e.n.Node               ] [H9z2zQY] closed

いろいろ調べてみると、「Your kernel does not support seccomp」とのことで、CentOS6では動かないようです。CentOS7にインストールしましょう。

4.参考

www.elastic.co

SecComp fails on CentOS 6 · Issue #22899 · elastic/elasticsearch · GitHubgithub.com

struts2脆弱性(CVE-2017-9805)(S2-052)の検証

0.はじめに

struts2脆弱性(CVE-2017-9805)の検証をしてみました。

1. 脆弱性概要

該当バージョンのstruts2を使用しており、REST プラグインを使用している場合に、 XML リクエストに悪意のあるコードを埋め込むことで、RCEが可能な脆弱性です。

2.環境

今回はrestプラグインが使用されている、「struts2-rest-showcase」を使用して検証します。「struts2-rest-showcase」はstruts2に同包されているアプリケーションです。

画面はこんな感じです。 f:id:secbeg:20171102081917p:plain

構築方法は下記を参考にしてください。

secbeg.hatenablog.com

3.PoC

curlコマンドを使用して検証してみます。 コードは隠していますが、下記コマンドを実行しています。

# touch /tmp/poc/attack

まず、/tmp/pocに何もファイルがないことを確認しておきます。

f:id:secbeg:20171102081319p:plain

その後、検証コードをサーバに送ります。

f:id:secbeg:20171102081427p:plain

4.確認

サーバに「attack」ファイルができていることを確認できます。

f:id:secbeg:20171102081553p:plain

restプラグインの使用が条件となりますが、検証コードがインターネットに出回っており、簡単に攻撃が可能であルため、早急な対策が必要です。

5.参考

S2-052 - Apache Struts 2 Documentation - Apache Software Foundation

Apache Struts 2 の脆弱性 (S2-052) に関する注意喚起

メモ

1.struts2のバージョン確認方法

下記のxxxを確認する。

webapps/struts2-showcase/WEB-INF/lib/struts2-core-2.x.x.x.jar

# find / -name struts2-core*

2.tar.gの解凍

tar -zxvf xxxx.tar.gz

3.ssh WARNING

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

vi .ssh/known_hosts

ddで該当の行を削除

4.CentOS7 でifconfigを使いたい場合

yum install net-tools

推奨は、

ip addr
ip a

4.時刻同期

yum install ntpdate
ntpdate ntp.nict.jp
広告を非表示にする

tomcat脆弱性(CVE-2017-12617)の検証

0.はじめに

tomcat脆弱性(CVE-2017-12617)を検証してみました。

1. 脆弱性概要

当該ソフトウェアにおいて、PUTリクエストを受付ける設定になっている場合、任意のjspファイルアップロードが行われる脆弱性。 putを許可しているんだから、ファイルをアップロードできるのは正常だろと思う人もいるかもしれませんが、tomcatではjspファイルのアップロードはできないようになっています。 任意のjspがアップロードされてしまうので、RCEが可能となります。

2. 設定

デフォルトでは、putが許可されていないので、許可するために下記にファイルを編集する。

# vi /opt/apache-tomcat-8.5.21/conf/web.xml

で、下記を適切な場所に追記する。

        <init-param>
                <param-name>readonly</param-name>
                <param-value>false</param-value>
        </init-param>

その後、tomcatを再起動する。

# /opt/apache-tomcat-8.5.21/bin/shutdown.sh
# /opt/apache-tomcat-8.5.21/bin/startup.sh

3. PoC(Proof of Concept)

f:id:secbeg:20171029002330p:plain

コードは隠していますが、jsp upload と記載されているhack.jspをアップロードするもの。

3. 確認

ブラウザから f:id:secbeg:20171029001454p:plain

サーバ側でも、
f:id:secbeg:20171029001704p:plain

検証は成功していることがわかる。

悪意のあるjspファイルがアップロードされることで、バックドアが作られる可能性があるため、早急な対策が必要。

4.参考

Apache Tomcat における脆弱性に関する注意喚起

struts2のshowcaseを動かしてみる

0.はじめに

struts2のshowcaseを動かしてみました

1. 各ソフトのインストール

secbeg.hatenablog.com

secbeg.hatenablog.com

secbeg.hatenablog.com

2. struts2の配置

cd /tmp
wget http://www-us.apache.org/dist/struts/2.5.13/struts-2.5.13-all.zip
unzip struts-2.5.13-all.zip
cp /tmp/struts-2.5.13/apps/struts2-showcase.war /root/apache-tomcat-9.0.1/webapps/

3. 動作確認

下記にアクセスすると、 http://[server]/struts2-showcase/sshowcase.action

showcaseの画面が表示されます。

f:id:secbeg:20171028204836p:plain

httpdとtomcatを連携させる

0.はじめに

httpdtomcatを連携させてみました
(cliant - httpd - tomcat)

1. インストール

secbeg.hatenablog.com

secbeg.hatenablog.com

2. 連携

# vi /opt/apache-tomcat-9.0.1/conf/server.xml

まずは、httpdからのアクセスのみを受け付けるために8080からのアクセス設定をコメントアウトします。

<!--
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
-->

次に、httpdからの受付設定(ajpコネクタ)にコメントアウトがある場合は、外します。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

これでtomcat側は完了。

# vi /opt/httpd/httpd-2.4.29/conf/httpd.conf

まず、下記モジュールのコメントアウトを外します。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

次にtomcatに渡す設定を追記します。

ProxyPass / ajp://localhost:8009/

3. 再起動

# /opt/apache-tomcat-9.0.1/bin/shutdown.sh
# /opt/apache-tomcat-9.0.1/bin/startup.sh

これで、tomcatに直接アクセス(http://[server]:8080)できなくなります。

# /opt/httpd/httpd-2.4.29/bin/apachectl stop
# /opt/httpd/httpd-2.4.29/bin/apachectl start

4. 起動確認 

 httpd(http://[server])にアクセスすると、tomcatの画面が表示されます。 f:id:secbeg:20171028091005p:plain