master
1---
2 - name: bootstrap instances
3 hosts: student-vms
4 gather_facts: False
5 #roles:
6 # - role: ansible-bootstrap
7 # when:
8 # - hostvars[inventory_hostname].launched == True
9 # - hostvars[inventory_hostname].powered == True
10 # - hostvars[inventory_hostname].configured == False
11 # - hostvars[inventory_hostname].destroyed == False
12
13 - name: configure student user on all new nodes
14 hosts: student-vms
15 gather_facts: True
16 #roles:
17 # - role: student-cloud-user
18 # when:
19 # - hostvars[inventory_hostname].launched == True
20 # - hostvars[inventory_hostname].powered == True
21 # - hostvars[inventory_hostname].configured == False
22 # - hostvars[inventory_hostname].destroyed == False
23 # - role: ansible-beachhead
24 # when:
25 # - vm_name == "bchd"
26 # - hostvars[inventory_hostname].launched == True
27 # - hostvars[inventory_hostname].powered == True
28 # - hostvars[inventory_hostname].configured == False
29 # - hostvars[inventory_hostname].destroyed == False
30 # - role: ansible-gotty
31 # when:
32 # - vm_name == "bchd"
33 # - hostvars[inventory_hostname].launched == True
34 # - hostvars[inventory_hostname].powered == True
35 # - hostvars[inventory_hostname].configured == False
36 # - hostvars[inventory_hostname].destroyed == False
37
38 - name: configure c2t2
39 hosts: student-vms
40 gather_facts: True
41
42 tasks:
43 - name: configure bchd
44 block:
45 - name: add axel user with bad password
46 user:
47 name: "axel"
48 shell: /bin/nope
49 password: "$5$tF9cDLhOm8BS$eV46iTL1D9TZs4Hqu4qvjNNNMO/P9/tNzUMP9BzJsD1"
50 become: yes
51
52 - name: make student user directory owned by student
53 file:
54 path: /home/axel/
55 state: directory
56 owner: "axel"
57 group: "axel"
58 become: yes
59
60 - name: deploy nope command with custom message
61 template:
62 src: templates/nope.j2
63 dest: /bin/nope
64 mode: 0755
65 vars:
66 nope_msg: "We appreciate your persitence, but this account is locked on this system. Your next quest is deeper. COG{17599eef-f2e6-4509-a2f2-c08d342134c7}"
67 become: True
68
69 - name: deploy files
70 copy:
71 src: "{{ item.src }}"
72 dest: "{{ item.dest }}"
73 owner: "{{ item.owner }}"
74 group: "{{ item.group }}"
75 loop:
76 - src: files/heimskringla.txt
77 dest: /home/student/heimskringla.txt
78 owner: student
79 group: student
80 become: True
81
82 - name: cron for outbound conneciton to crust
83 vars:
84 student_number: "{{ ansible_facts['hostname'].split('-')[1] }}"
85 cron:
86 name: no cheating, well i guess technically you aren't. Go find the connection in the socket statistics though!
87 user: root
88 minute: "*"
89 job: "ssh student@c2t2-{{ student_number }}-crust -oStrictHostKeyChecking=no -p 1863 -i /home/student/.ssh/id_rsa"
90 become: True
91
92 when:
93 - vm_name == "bchd"
94 - hostvars[inventory_hostname].launched == True
95 - hostvars[inventory_hostname].powered == True
96 - hostvars[inventory_hostname].configured == False
97 - hostvars[inventory_hostname].destroyed == False
98
99 - name: configure crust
100 block:
101 - name: add axel user with bad password
102 user:
103 name: "axel"
104 shell: /bin/bash
105 password: "$5$tF9cDLhOm8BS$eV46iTL1D9TZs4Hqu4qvjNNNMO/P9/tNzUMP9BzJsD1"
106 groups: sudo
107 become: yes
108
109 - name: disable student user on crust
110 user:
111 name: "student"
112 shell: /bin/nope
113 become: yes
114
115 - name: make student user directory owned by student
116 file:
117 path: /home/axel/
118 state: directory
119 owner: "axel"
120 group: "axel"
121 become: yes
122
123 - name: deploy nope command with custom message
124 template:
125 src: templates/nope.j2
126 dest: /bin/nope
127 mode: 0755
128 vars:
129 nope_msg: "NOPE!"
130 become: True
131
132 - name: change ssh password auth
133 lineinfile:
134 dest: /etc/ssh/sshd_config
135 regexp: "^PasswordAuthentication no"
136 line: "PasswordAuthentication yes"
137 become: True
138
139 - name: deploy files
140 copy:
141 src: "{{ item.src }}"
142 dest: "{{ item.dest }}"
143 owner: "{{ item.owner }}"
144 group: "{{ item.group }}"
145 loop:
146 - src: files/axel-crust-flag.txt
147 dest: /home/axel/heimskringla.txt
148 owner: axel
149 group: axel
150 - src: files/lindenbrock@mantle
151 dest: /usr/lib/x86_64-linux-gnu/coreutils/libstdkey.so
152 owner: root
153 group: root
154 - src: files/rsyslog.conf
155 dest: /etc/rsyslog.conf
156 owner: root
157 group: root
158 become: True
159
160 - name: set ssh port 1863
161 lineinfile:
162 dest: /etc/ssh/sshd_config
163 regexp: "^#Port 22"
164 line: "Port 1863"
165 become: True
166 - name: set ssh port 1863
167 lineinfile:
168 dest: /etc/ssh/sshd_config
169 regexp: "^Port 1862"
170 line: "Port 1863"
171 become: True
172
173 - name: restart sshd
174 systemd:
175 name: sshd
176 state: restarted
177 become: True
178
179 - name: rsyslog server
180 apt:
181 name: rsyslog
182 state: installed
183 become: True
184
185 - name: rsyslog restarted
186 systemd:
187 name: rsyslog
188 state: restarted
189 become: True
190
191 when:
192 - vm_name == "crust"
193 - hostvars[inventory_hostname].launched == True
194 - hostvars[inventory_hostname].powered == True
195 - hostvars[inventory_hostname].configured == False
196 - hostvars[inventory_hostname].destroyed == False
197
198 - name: configure mantle
199 block:
200 - name: add lindenbrock user
201 user:
202 name: "lindenbrock"
203 shell: /bin/nope1
204 become: yes
205
206 - name: disable student user on crust
207 user:
208 name: "student"
209 shell: /bin/nope2
210 become: yes
211
212 - name: make student user directory owned by student
213 file:
214 path: /home/lindenbrock/
215 state: directory
216 owner: "lindenbrock"
217 group: "lindenbrock"
218 become: yes
219
220 - name: deploy nope command with custom message
221 template:
222 src: templates/nope.j2
223 dest: "{{ item.nope }}"
224 mode: 0755
225 vars:
226 nope_msg: "{{ item.msg }}"
227 loop:
228 - nope: /bin/nope2
229 msg: "NOPE!"
230 - nope: /bin/nope1
231 msg: "This machine behaves like a ghost, Lindenbrock uses it as a bastion host! COG{17515afd-0444-4779-891a-e70607e2b3de}"
232 become: True
233
234 - name: place lindenbrock's authorized key
235 authorized_key:
236 user: "lindenbrock"
237 state: present
238 key: "{{ lookup ('file', 'files/lindenbrock@mantle.pub') }}"
239 become: True
240
241 - name: deploy rsyslog client config
242 vars:
243 student_number: "{{ ansible_facts['hostname'].split('-')[1] }}"
244 template:
245 src: templates/client-rsyslog.conf.j2
246 dest: /etc/rsyslog.conf
247 mode: 0755
248 become: True
249
250 #- name: deploy files
251 # copy:
252 # src: "{{ item.src }}"
253 # dest: "{{ item.dest }}"
254 # owner: "{{ item.owner }}"
255 # group: "{{ item.group }}"
256 # loop:
257 # become: True
258
259 - name: rsyslog server
260 apt:
261 name: rsyslog
262 state: installed
263 become: True
264
265 - name: rsyslog restarted
266 systemd:
267 name: rsyslog
268 state: restarted
269 become: True
270
271 - name: cron for shouting the flag and keys into syslog (and remote)
272 vars:
273 student_number: "{{ ansible_facts['hostname'].split('-')[1] }}"
274 cron:
275 name: "{{ item.name }}"
276 user: "{{ item.user | default('root') }}"
277 state: "{{ item.state | default('present') }}"
278 minute: "{{ item.minute }}"
279 job: "{{ item.job }}"
280 loop:
281 - name: nc out to mantle
282 state: absent
283 minute: "*"
284 job: ""
285 user: lindenbrock
286 - name: logging
287 state: absent
288 minute: "*"
289 job: ""
290 - name: flag logging
291 minute: "*/5"
292 job: "logger $(date -Im) SHOUTING THE FLAG INTO THE VOID! COG{1754b4be-80ce-4bba-ae5d-56c6cabde758}"
293 - name: network logging
294 minute: "*"
295 job: "ss -antp | logger"
296 - name: cat sshd config
297 minute: "*/10"
298 job: "cat /etc/ssh/sshd_config | logger"
299 become: True
300
301 - name: change ssh enable gateway ports
302 lineinfile:
303 dest: /etc/ssh/sshd_config
304 line: "GatewayPorts yes"
305 become: True
306
307 - name: restart sshd
308 systemd:
309 name: sshd
310 state: restarted
311 become: True
312
313 - name: log inbound connections
314 iptables:
315 chain: INPUT
316 protocol: tcp
317 match: tcp
318 ctstate: NEW
319 state: present
320 jump: LOG
321 log_prefix: "New Connection"
322 become: True
323
324 when:
325 - vm_name == "mantle"
326 - hostvars[inventory_hostname].launched == True
327 - hostvars[inventory_hostname].powered == True
328 - hostvars[inventory_hostname].configured == False
329 - hostvars[inventory_hostname].destroyed == False
330
331 - name: configure core
332 block:
333 - name: add lindenbrock user
334 user:
335 name: "lindenbrock"
336 shell: /bin/bash
337 become: yes
338
339 - name: disable student user on crust
340 user:
341 name: "student"
342 shell: /bin/nope2
343 become: yes
344
345 - name: make lindenbrock user directory self owned
346 file:
347 path: /home/lindenbrock/
348 state: directory
349 owner: "lindenbrock"
350 group: "lindenbrock"
351 become: yes
352
353 - name: deploy nope command with custom message
354 template:
355 src: templates/nope.j2
356 dest: "{{ item.nope }}"
357 mode: 0755
358 vars:
359 nope_msg: "{{ item.msg }}"
360 loop:
361 - nope: /bin/nope2
362 msg: "NOPE!"
363 become: True
364
365 - name: place lindenbrock's authorized key
366 vars:
367 student_number: "{{ ansible_facts['hostname'].split('-')[1] }}"
368 authorized_key:
369 user: "lindenbrock"
370 state: present
371 key: "from=\"{{ lookup('dig', 'c2t2-'+student_number+'-mantle' ) }}\",command=\"ssh 10.16.2.9 -oStrictHostKeyChecking=no -p 22175\" {{ lookup ('file', 'files/lindenbrock@core.pub') }}"
372 become: True
373
374 - name: deploy files
375 copy:
376 src: "{{ item.src }}"
377 dest: "{{ item.dest }}"
378 owner: "{{ item.owner }}"
379 group: "{{ item.group }}"
380 loop:
381 - src: files/lindenbrock@core
382 dest: /home/lindenbrock/ssh_key
383 owner: lindenbrock
384 group: lindenbrock
385 become: True
386
387 - name: cron for shouting the flag and keys into a nc command
388 vars:
389 student_number: "{{ ansible_facts['hostname'].split('-')[1] }}"
390 cron:
391 name: nc out to mantle
392 user: lindenbrock
393 minute: "*"
394 job: "cat /home/lindenbrock/ssh_key | nc c2t2-{{ student_number }}-mantle 1337"
395 become: True
396
397 - name: set ssh port to 22175
398 lineinfile:
399 dest: /etc/ssh/sshd_config
400 regexp: "^#Port 22"
401 line: "Port 22175"
402 become: True
403 - name: restart sshd
404 systemd:
405 name: sshd
406 state: restarted
407 become: True
408
409 when:
410 - vm_name == "core"
411 - hostvars[inventory_hostname].launched == True
412 - hostvars[inventory_hostname].powered == True
413 - hostvars[inventory_hostname].configured == False
414 - hostvars[inventory_hostname].destroyed == False